【问题标题】:Why isn't the struct object a type? [duplicate]为什么结构对象不是类型? [复制]
【发布时间】:2018-09-23 22:42:17
【问题描述】:

我确定我误解了什么。

在类中实例化一个结构对象并将其作为值传递给构造函数后,我得到一个错误?

错误:'test' 不是类型

#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;
}

【问题讨论】:

  • C++ 是世界上最区分大小写的语言之一。 Test 是类型,test 是类型 Test 的 B 类成员。如果写A a(Test) 可以解决您的问题,请告诉我们,然后我们可以将问题作为简单的错字关闭。
  • @dlatikay “最”?是否存在半关心和麻木的语言?
  • 只是一个愚蠢的玩笑。但谁知道:)
  • 这确实是一个简单的错字:要么忘记函数声明中的类型,要么大小写错误,要么为默认成员 init 使用了错误类型的括号。我的问题是为什么你希望它在第一名!
  • @dlatikay:我能想到的唯一不区分大小写的编程语言是 Visual Basic。奇怪的是,SQL 也是不区分大小写的。但关键是,C++ 的大小写敏感性在软件工程领域几乎没有什么特别之处。

标签: c++ struct


【解决方案1】:

如果要将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   
};

请注意,default member initializer 仅支持大括号或等于,但不支持括号初始化器。并且仅在成员初始化器列表中省略成员时使用。

编译器试图将a 解释为一个函数,它返回A 并将test 作为参数。 test 不是类型名称然后编译失败。

【讨论】:

  • 我希望 OPs 示例不是最令人烦恼的解析(实际上是吗?!),至于编译器应该很容易意识到这不是函数定义。仍然想知道为什么这样的情况在 C++ 标准中没有“更新”。
  • @vsoftco 标准只是不允许默认成员初始化程序的括号初始化程序,我也想知道为什么;但我认为最麻烦的解析在这里是无关紧要的,因为Test test; A a{test}; 如果你把它放在一个函数中就很好了;默认成员初始值设定项是不允许的。
  • 谢谢。 “如果您想将 a 声明为数据成员并对其进行初始化”,那是我对“在类中实例化结构对象”不正确的想法,我想念通常无法像通常那样调用 A a(test)一个函数。
【解决方案2】:

在 [I] 在类中实例化一个结构对象之后...

class B
{
    private:
        Test test;

这不是实例化 任何东西。这声明每个(此时,理论类型为B 的对象将有一个名为test 的成员变量,类型为Test

(此外,在你的学习过程中尽早养成使用任何成员变量private而不是public的习惯。class 不仅仅是带有函数的struct,它是一个基本的 OOP 构建块应该将其数据成员暴露给public——这样做通常是一个设计错误。)

        A a(test);   //error    

正如您所说,这不是“将 [test] 作为参数传递给构造函数”!

这是为类B声明一个名为a的成员函数,它返回一个A类型的对象,并接受一个test类型的未命名参数...... type,只是该名称的成员变量,这是一个错误。

由于您的代码示例的总体目的相当不清楚,因此很难说什么对您来说是“正确的”。

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2011-11-15
    • 2011-12-06
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多