Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 124
1

Объяснить причины ошибки "Extra qualification 'CLASS CONSTRUCTOR' and 'CLASS' has incomplete type"

13.01.2016, 19:06. Просмотров 316. Ответов 6
Метки нет (Все метки)

Согласно синтаксису, вроде все правильно, но ошибка... что не так? Ошибки компилятора ниже на рисунке...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
class CLB
{   private:
        int fignya;
    public:
        CLB::CLB(){};
};
 
class CL1: public CLB
{   private:
        int x;
    public:
        CL1::CL1:CLB(){};
        void Method(){cout << "Hello!\n";};
};
 
int main()
{
    CL1 c1;
 
    c1.Method();
 
    cin.get();
    return 0;
}
0
Миниатюры
Объяснить причины ошибки "Extra qualification 'CLASS CONSTRUCTOR' and 'CLASS' has incomplete type"  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2016, 19:06
Ответы с готовыми решениями:

Найти причины и способы исправления ошибки: Error - member access into incomplete type 'Node'
Здравствуйте. Пытаюсь обратиться к переменной структуры, добавить в неё (в вектор) новый элемент,...

В чем причина ошибки extra qualification
Видает ошибку extra qualification 'RyadokIdentifier::' on member 'Lowercase' в чем причина...

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union
Помогите, пожалуйста! Компилирую в VS2010... Ошибка: C2228: left of &quot;.real&quot;,&quot;.imag&quot; must have...

Исправить ошибку C2079 "MiniPlayer::music" использует неопределенный class "MiniMusic"
Приветствую. Ситуация следующая - есть 2 класса, оба используют друг друга. При компиляции вылезает...

Синтаксическая ошибка: отсутствие ";" перед "<class-head>"
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv)...

6
zss
Модератор
Эксперт С++
7254 / 6702 / 4241
Регистрация: 18.12.2011
Сообщений: 17,690
Завершенные тесты: 1
13.01.2016, 19:23 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
class CLB
{   private:
        int fignya;
    public:
        CLB(){};
};
 
class CL1: public CLB
{   private:
        int x;
    public:
        CL1():CLB(){};
        void Method(){cout << "Hello!\n";};
};
 
int main()
{
    CL1 c1;
 
    c1.Method();
 
    cin.get();
    return 0;
}
1
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 124
13.01.2016, 20:33  [ТС] 3
Хорошо, а если немного модифицировать программу, почему не выводится N=5 строк... ? Ошибка компилляции...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
 
class CLB
{private:
        int fignya;
    public:
        CLB(){};
//добавляем пустую функцию вызова, чтобы исопльзовать полиморфный вызов
        void Call()                 {Method();  };
        virtual void Method(){};
};
 
class CL1: public CLB
{   private:
        int x;
    public:
        CL1():CLB(){};
        virtual void Method()       {cout << "Hello!\n";};
};
//добавляем процедуру, которая применяет к указателю на экземпляр класса указатель на метод:
typedef void (CLB::* CLBMethod)();
void MakeClassCall(int n, CLB *ClassLink, CLBMethod MethodLink)
{
    for(int i=0;i<n;i++)
    {
        ((ClassLink+i) ->* MethodLink)();
    }
}
//хотим, чтобы вывелась строка 5 раз:
int main()
{
    const int   N = 5;
    CL1         c1[N];
 
    CLB*        clink = c1;         //указатель на массив экземпляров класса
    CLBMethod   mlink = &CLB::Call; //указатель на метод базового класса
 
    MakeClassCall(N,clink,mlink);
 
    cin.get();
    return 0;
}
0
Миниатюры
Объяснить причины ошибки "Extra qualification 'CLASS CONSTRUCTOR' and 'CLASS' has incomplete type"  
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 124
13.01.2016, 20:38  [ТС] 4
Сорри, компиллируется нормально, при запуске повисает...
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
13.01.2016, 20:54 5
xlxndr, ну смотрите,
шагаем по массиву (ClassLink+i), думая, что ClassLink "указывает" на объекты типа CLB, а на самом деле там CL1.
Соответственно, смещение указателя происходит на sizeof(CLB) байт, а не на sizeof(CL1).
1
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 124
13.01.2016, 21:02  [ТС] 6
Но именно так, через указатели часто работают с массивами, структурами... насчет классов не слышал конечно, но решил применить аналогию... Это же фундаментальная для понимания вещь! Спасибо!
А можно ли как-нибудь задать это смещение по указателю вручную, чтобы "попадать в нужные биты"? При этом предполагается, что процедура "связывания указателя на класс и указателя на метод" должна быть достаточно универсальна?
0
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 124
15.01.2016, 15:04  [ТС] 7
Удалось решить эту задачу...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
using namespace std;
 
class CLB
{private:
        int fignya;
    public:
        CLB(){};
//добавляем пустую функцию вызова, чтобы исопльзовать полиморфный вызов
        void Call()                 {Method();  };
        virtual void Method(){};
};
 
class CL1: public CLB
{   private:
        int x;
    public:
        CL1():CLB(){};
        virtual void Method()       {cout << "Hello!\n";};
};
//добавляем процедуру, которая применяет к указателю на экземпляр класса указатель на метод:
typedef void (CLB::* CLBMethod)();
 
template <class CLs1>
void MakeClassCall(int n, CLB *ClassLink, CLs1 tcl, CLBMethod MethodLink)
{
    for(int i=0;i<n;i++)
    {
        int k =0;
        ((ClassLink + k*sizeof(*tcl)) ->* MethodLink)();
        k++;
    }
}
 
//хотим, чтобы вывелась строка 5 раз:
int main()
{
    const int   N = 5;
    CLB         cb[N];
    CL1         c1[N];
 
    CLB*        clink = c1;                //указатель на массив экземпляров класса
    CLBMethod   mlink = &CLB::Call; //указатель на метод базового класса
 
    MakeClassCall(N,clink,c1,mlink);
 
    cin.get();
    return 0;
}
0
15.01.2016, 15:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2016, 15:04

Ошибка "expected constructor, destructor, or type conversion"
//ourfunc.cpp - îïðåäåëÿåò âàøó ñîáñòâåííóþ ôóíêöèþ #include &lt;iostream&gt; using namespace std;...

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int')
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i !=...

Class "IEntity" не содержит члена "m_pEntityId"
помогите 24 IntelliSense: class &quot;IEntity&quot; не содержит члена &quot;m_pEntityId&quot;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru