Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;尝试创建令牌向量时出错 我目前在Stroustrup的《原理与实践》一书中学习如何使用C++编程。我在一个他们介绍代币并展示如何使用它们的地方。我试图做一个简单的测试,以确保正确地构造类,并正确地使用标记和向量_C++_Class_Vector_Constructor_Token - Fatal编程技术网

C++;尝试创建令牌向量时出错 我目前在Stroustrup的《原理与实践》一书中学习如何使用C++编程。我在一个他们介绍代币并展示如何使用它们的地方。我试图做一个简单的测试,以确保正确地构造类,并正确地使用标记和向量

C++;尝试创建令牌向量时出错 我目前在Stroustrup的《原理与实践》一书中学习如何使用C++编程。我在一个他们介绍代币并展示如何使用它们的地方。我试图做一个简单的测试,以确保正确地构造类,并正确地使用标记和向量,c++,class,vector,constructor,token,C++,Class,Vector,Constructor,Token,下面是我所做的一个例子 class Test{ public: char kind; double value; Test(char ch) :kind(ch), value(0){} Test(char ch, double val) :kind(ch),value(val){} }; int main(){ vector<Test>testLoop; for(char i = 'a'; i &

下面是我所做的一个例子

class Test{
public:
    char kind;
    double value;
    Test(char ch)
        :kind(ch), value(0){}
    Test(char ch, double val)
        :kind(ch),value(val){}

};

int main(){

    vector<Test>testLoop;

    for(char i = 'a'; i < 'k'; i++){
        testLoop.push_back(i, 1);
    }
    cout << testLoop[5].kind << endl << testLoop[5].value;
}
类测试{
公众:
炭类;
双重价值;
测试(char ch)
:种类(ch),值(0){}
测试(字符通道,双值)
:种类(ch),值(val){}
};
int main(){
向量测试环;
for(字符i='a';i<'k';i++){
testLoop.push_back(i,1);
}
cout获取向量中存储的类型的对象

testLoop.push_back(Test(i, 1));
您还可以使用,它接受类型的构造函数参数并直接在向量中构造对象:

testLoop.emplace_back(i, 1);

类测试有两个构造函数。 具有一个参数的构造函数

Test(char ch)
    :kind(ch), value(0){}
被称为转换构造函数,因为它实际上将类型(在本例中)为
char
的对象转换为类型为
Test

因此,您可以按以下方式调用方法
push_back

for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back( i );
}
然后编译器无法隐式调用它,并将发出错误。在这种情况下,您必须自己显式指定构造函数

for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back( Test( i ) );
}
for(字符i='a';i<'k';i++){
testLoop.push_back(测试(i));
}
如果在循环中使用两个参数

for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back(i, 1);
}
for(字符i='a';i<'k';i++){
testLoop.push_back(i,1);
}
编译器不是那么聪明,不能隐式调用具有两个参数的构造函数。它发出错误更简单

但是,如果编译器支持C++ 2011

的这个特性,可以使用初始化列表
for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back( { i, 1 } );
}
for(字符i='a';i<'k';i++){
testLoop.push_back({i,1});
}

在这种情况下,编译器可以使用两个参数隐式调用构造函数。

或者,
testLoop.push_back({i,1});
。非常感谢!它完成了我希望它做的事情,但我不完全理解为什么会这样。通过push_back(Test(i,1)),我是在调用构造函数还是在调用类?@Claystor
Test(i,1)
调用一个
Test
构造函数并生成一个
Test
对象。该对象被复制到向量中。哦!这很有意义!非常感谢!
for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back( Test( i ) );
}
for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back(i, 1);
}
for(char i = 'a'; i < 'k'; i++){
    testLoop.push_back( { i, 1 } );
}