C++ 为什么不是';结构对象不是类型吗?
我肯定我误解了什么 在类内实例化一个struct对象并将其作为值传递给构造函数之后,我得到了一个错误 错误:“测试”不是类型C++ 为什么不是';结构对象不是类型吗?,c++,struct,C++,Struct,我肯定我误解了什么 在类内实例化一个struct对象并将其作为值传递给构造函数之后,我得到了一个错误 错误:“测试”不是类型 #include <iostream> using namespace std; struct Test { int x = 11; int y = 22; }; class A { private: int foo = 100; public: A(Test tmp){} }; class B { priva
#include <iostream>
using namespace std;
struct Test
{
int x = 11;
int y = 22;
};
class A
{
private:
int foo = 100;
public:
A(Test tmp){}
};
class B
{
private:
Test test;
A a(test); //error
public:
B(){}
};
int main()
{
B b;
return 0;
}
#包括
使用名称空间std;
结构测试
{
int x=11;
int y=22;
};
甲级
{
私人:
int-foo=100;
公众:
A(测试tmp){}
};
B类
{
私人:
试验;
A(测试);//错误
公众:
B(){}
};
int main()
{
B B;
返回0;
}
在[I]实例化类内的结构对象之后
这不是实例化任何东西。这声明每个(此时,B
类型的理论对象将有一个名为test
的test
类型的成员变量
(此外,在学习过程中尽早养成将任何成员变量设置为private
,而不是public
的习惯。类
不仅仅是一个带有函数的结构,它是一个基本的OOP构建块,不应该将其数据成员公开给public
——这样做很常见(这是一个设计错误。)
这不是您所说的“将[test
]作为参数传递给构造函数!”
这是向名为a
的类B
声明一个成员函数,该类返回类型为a
的对象,并接受类型为test
…的未命名参数,由于没有此类类型,因此只有该名称的成员变量,这是一个错误
由于您的代码示例的总体目的不清楚,很难说什么对您来说是“正确的”。如果您想将a
声明为数据成员并对其进行初始化,正确的语法应该是:
class B
{
private:
Test test;
A a{test}; // default member initializer
A a = test; // default member initializer
A a = A(test); // default member initializer
public:
B() : a(test) {} // member initializer list
};
请注意,仅支持大括号或等于,但不支持括号初始值设定项。并且仅当成员初始值设定项列表中省略了该成员时才使用它
编译器试图将a
解释为一个函数,该函数返回a
并将test
作为参数。test
不是一个类型名,编译失败。C++是世界上最区分大小写的语言。test
是类型,test
是类型的B类成员测试
。让我们知道,如果编写A(测试)
解决了您的问题,那么我们就可以简单地输入错误来结束这个问题。@dlatikay“最多”?是否有不关心案例和不关心案例的语言?只是一个愚蠢的笑话。但谁知道呢:)这确实是一个简单的输入错误:要么忘记函数声明中的类型,要么大小写错误,要么对默认成员init使用了错误的括号。我的问题是,为什么您希望它首先起作用!@dlatikay:我能想到的唯一一种不区分大小写的编程语言是Visual Basic。奇怪的是,SQL是case也是不敏感的。但问题是C++的区分大小写在软件工程领域几乎没有什么特别之处。我希望OPs示例不是一个最麻烦的解析(是吗?!),至于编译器,它应该很容易实现这不是一个函数定义。仍然想知道为什么像这样的案例没有“更新”在C++标准中,@ VSOFTCO标准不允许默认成员initializer的括号初始化器,我想知道为什么,但是我认为大多数恼人的解析在这里是不相关的,因为<代码>测试;A {测试};< /C> >在函数内是很好的;它不允许默认成员initializer。谢谢。“如果您想将a声明为数据成员并对其进行初始化”,这是我在“在类内实例化一个结构对象”中不正确的想法,我错过了通常从函数调用a(测试)是不可能的。
A a(test); //error
class B
{
private:
Test test;
A a{test}; // default member initializer
A a = test; // default member initializer
A a = A(test); // default member initializer
public:
B() : a(test) {} // member initializer list
};