class 在另一个 class 中的构造函数问题
Constructor problems with class inside another class
我认为问题的标题可能不太正确,但是,我有一个 class(我们称它为 A),它有一个需要指向另一个 class(称为 B)的构造函数).这很好,但是当我在第三个 class(称为 C)中定义一个 class 时,在将变量放入构造函数后我得到这个错误:error: expected identifier before ‘&’ token
,然后如果我删除&
我得到:error: ‘ClassA’ is not a type
.
看不懂我刚才说的那些人(我不怪你),举个例子:
class A
{
private:
int number;
//etc, etc...
};
class B
{
private:
A* ClassAPntr;
public:
B(A* objectPointer)
{
ClassAPntr = objectPointer;
}
};
class C
{
private:
A ClassA;
B ClassB(&ClassA);
};
int main()
{
C classC;
}
您实际上并未为 class C
声明构造函数。你的意思是这样的:
class C
{
public:
C()
: b(&a) // you have to provide the arguments to B's constructor here
{ }
private:
A a;
B b; // ... not here
};
澄清一下,当您通过将 A classA
private object
添加到 class C
来执行 composition
时,编译器会接受此步骤,因为 A 具有未定义的构造函数,这意味着编译器将为您创建一个默认构造函数并在 make A classA
.
时调用它
class B
中的问题,因为它有一个非默认的用户定义的构造函数,这意味着编译器应该强制您在 class C 中通过构造函数初始化列表或通过 c 中的大括号调用它++11,所以它成为你的责任只是因为编译器不知道你要为 class B
传递哪个 class A Object
的地址
构造函数。
那么您为什么会收到此错误消息:class A is not a type
或 expected identifier before ‘&’ token
?
答案是编译器认为 B ClassB(&ClassA)
是 private
函数的声明,其名称为 ClassB
并且 return 值类型为 B class
。
并且因为您从未在 class 中使用此函数,所以编译器永远不会给您任何与定义相关的错误。并且您也永远不会在 main 等其他函数中使用此成员函数,因为它是私有的
要产生未定义的引用错误,您可以将 c class
修改为如下所示:
class C
{
private:
A classA;
B classB();
friend B func() ;
};
B func() {
C c;
return c.classB(); // undefined reference Error
}
我认为问题的标题可能不太正确,但是,我有一个 class(我们称它为 A),它有一个需要指向另一个 class(称为 B)的构造函数).这很好,但是当我在第三个 class(称为 C)中定义一个 class 时,在将变量放入构造函数后我得到这个错误:error: expected identifier before ‘&’ token
,然后如果我删除&
我得到:error: ‘ClassA’ is not a type
.
看不懂我刚才说的那些人(我不怪你),举个例子:
class A
{
private:
int number;
//etc, etc...
};
class B
{
private:
A* ClassAPntr;
public:
B(A* objectPointer)
{
ClassAPntr = objectPointer;
}
};
class C
{
private:
A ClassA;
B ClassB(&ClassA);
};
int main()
{
C classC;
}
您实际上并未为 class C
声明构造函数。你的意思是这样的:
class C
{
public:
C()
: b(&a) // you have to provide the arguments to B's constructor here
{ }
private:
A a;
B b; // ... not here
};
澄清一下,当您通过将 A classA
private object
添加到 class C
来执行 composition
时,编译器会接受此步骤,因为 A 具有未定义的构造函数,这意味着编译器将为您创建一个默认构造函数并在 make A classA
.
class B
中的问题,因为它有一个非默认的用户定义的构造函数,这意味着编译器应该强制您在 class C 中通过构造函数初始化列表或通过 c 中的大括号调用它++11,所以它成为你的责任只是因为编译器不知道你要为 class B
传递哪个 class A Object
的地址
构造函数。
那么您为什么会收到此错误消息:class A is not a type
或 expected identifier before ‘&’ token
?
答案是编译器认为 B ClassB(&ClassA)
是 private
函数的声明,其名称为 ClassB
并且 return 值类型为 B class
。
并且因为您从未在 class 中使用此函数,所以编译器永远不会给您任何与定义相关的错误。并且您也永远不会在 main 等其他函数中使用此成员函数,因为它是私有的
要产生未定义的引用错误,您可以将 c class
修改为如下所示:
class C
{
private:
A classA;
B classB();
friend B func() ;
};
B func() {
C c;
return c.classB(); // undefined reference Error
}