为啥相同的语句不适用于 C++ 中的类成员?

Posted

技术标签:

【中文标题】为啥相同的语句不适用于 C++ 中的类成员?【英文标题】:Why the same statement doesn't work for Class member in C++?为什么相同的语句不适用于 C++ 中的类成员? 【发布时间】:2021-01-05 09:19:16 【问题描述】:

我对 C++ 很陌生,下面是我的程序。它定义了一个嵌套向量。

#include <vector>

using namespace std;

int main(int argc, char *argv[]) 
    vector<vector<int>> grid(10, vector<int>(10, 10000));
    return 0;

当我定义同一个向量作为类成员时,报语法错误:

#include <vector>

using namespace std;

class Test 
public:
    vector<vector<int>> grid(10, vector<int>(10, 10000));
;

int main(int argc, char *argv[]) 
    vector<vector<int>> grid(10, vector<int>(10, 10000));
    return 0;

如何定义vector&lt;vector&lt;int&gt;&gt; 类型的类成员并将其初始化为10 vector&lt;int&gt;(10, 10000)?我试图在构造函数中声明变量并初始化它,但是编译器报告C:\my_projects\cpp1\main.cpp(8): error C2064: term does not evaluate to a function taking 2 arguments

#include <vector>

using namespace std;

class Test 
public:
    Test() 
        grid(10, vector<int>(10, 10000));
    

public:
    vector<vector<int>> grid;
;

int main(int argc, char *argv[]) 
    vector<vector<int>> grid(10, vector<int>(10, 10000));
    return 0;

【问题讨论】:

I'm very new to C++ 这就是为什么你应该使用good C++ book。 C++ 很复杂,尝试从各种互联网资源和直觉中学习它不会让你走得太远、很快。 【参考方案1】:

default member initializer(C++11 起)可以使用花括号初始化器或等号初始化器,它们不支持括号初始化器;正如错误消息所说,它试图被解释为函数。

例如

class Test 
public:
    vector<vector<int>> grid10, vector<int>(10, 10000);
;

class Test 
public:
    vector<vector<int>> grid = vector<vector<int>>(10, vector<int>(10, 10000));
;

【讨论】:

感谢您的快速回复!我还有一个问题。为什么vector&lt;long&gt; numbers20, 99L; 表示用两个初始值初始化一个向量,而vector&lt;vector&lt;int&gt;&gt; grid10, vector&lt;int&gt;(10, 10000); 表示10 vector&lt;int&gt;(10, 10000) @Justalearner 因为std::vector 有一个constructor 采用std::initializer_list(链接页面中的#10),在使用花括号初始化器初始化时是首选。 10, vector&lt;int&gt;(10, 10000) 无法构造有效的std::initializer_list,那么vector&lt;vector&lt;int&gt;&gt; grid10, vector&lt;int&gt;(10, 10000); 将使用#3 构造函数。 再次感谢您的澄清!【参考方案2】:

您的构造函数初始化程序错误。它应该是(':' 之后的初始化程序)。 示例(Live):

class Test 
public:
    Test() : grid(10, vector<int>(10, 10000))
    
         // grid(10, vector<int>(10, 10000)); error: this is not initializer
         // grid = vector<vector<int>>(10, vector<int>(10, 10000)) - this is ok
    

public:
    vector<vector<int>> grid;
;

对于类内成员初始化,您可以使用花括号“”或“=”来避免大多数 vexing parse problem (Live):

class Test 
public:
    vector<vector<int>> grid10, vector<int>(10, 10000);
;

【讨论】:

以上是关于为啥相同的语句不适用于 C++ 中的类成员?的主要内容,如果未能解决你的问题,请参考以下文章

c++ 类包含一个与自身类型相同的静态成员。为啥是这种模式?

c++ 中的每个对象是不是包含不同版本的类成员函数?

为啥派生类的朋友不能使用受保护的成员?

C++的=重载问题,怎样为两个有相同成员的类赋值

类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型

c++中的String类,为啥直接用于cout就能输出?它里面包含了啥?