未在向量(C+;+;)中正确存储/检索对象 我是一个完整的C++初学者。 我尝试做一些看起来很基本的事情:创建一个特定类的对象,将其存储在向量中,然后输出该对象的值。此时,它输出一个矩形字符,而不管我存储的是什么字符。 代码如下: #include <iostream> #include <string> #include <cstdlib> #include <conio.h> #include <time.h> #include <windows.h> #include <vector> #include <algorithm> #include <map> using namespace std; class terrainType { public: string name; char symbol; int freq; terrainType(string,char,int); }; terrainType::terrainType(string name, char symbol, int freq) { name=name; symbol=symbol; freq=freq; } int main() { vector<terrainType> terrainTypes; terrainType dirt("dirt",'.',1); terrainTypes.push_back(dirt); cout << terrainTypes[0].symbol; return 0; } #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 类地形类型 { 公众: 字符串名; 字符符号; 国际频率; terrainType(字符串、字符、整数); }; terrainType::terrainType(字符串名称、字符符号、整数频率) { 名称=名称; 符号=符号; 频率=频率; } int main() { 矢量地形类型; terrainType污垢(“污垢”和“.”,1); 地形类型。推回(泥土); cout

未在向量(C+;+;)中正确存储/检索对象 我是一个完整的C++初学者。 我尝试做一些看起来很基本的事情:创建一个特定类的对象,将其存储在向量中,然后输出该对象的值。此时,它输出一个矩形字符,而不管我存储的是什么字符。 代码如下: #include <iostream> #include <string> #include <cstdlib> #include <conio.h> #include <time.h> #include <windows.h> #include <vector> #include <algorithm> #include <map> using namespace std; class terrainType { public: string name; char symbol; int freq; terrainType(string,char,int); }; terrainType::terrainType(string name, char symbol, int freq) { name=name; symbol=symbol; freq=freq; } int main() { vector<terrainType> terrainTypes; terrainType dirt("dirt",'.',1); terrainTypes.push_back(dirt); cout << terrainTypes[0].symbol; return 0; } #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 类地形类型 { 公众: 字符串名; 字符符号; 国际频率; terrainType(字符串、字符、整数); }; terrainType::terrainType(字符串名称、字符符号、整数频率) { 名称=名称; 符号=符号; 频率=频率; } int main() { 矢量地形类型; terrainType污垢(“污垢”和“.”,1); 地形类型。推回(泥土); cout,c++,object,vector,C++,Object,Vector,构造函数中的三个赋值实际上是无操作(将每个变量赋值给自身): 问题是,您有两个东西叫做name,您希望编译器在name=name中找出左侧指的是其中一个,而右侧指的是另一个 解决此问题的最干净方法是更改为构造函数,如下所示: terrainType::terrainType(string name, char symbol, int freq) : name(name), symbol(symbol), freq(freq) { } 语言规则是这样的,这将具有预期的意义 另一种选择是避

构造函数中的三个赋值实际上是无操作(将每个变量赋值给自身):

问题是,您有两个东西叫做
name
,您希望编译器在
name=name
中找出左侧指的是其中一个,而右侧指的是另一个

解决此问题的最干净方法是更改为构造函数,如下所示:

terrainType::terrainType(string name, char symbol, int freq)
: name(name),
  symbol(symbol),
  freq(freq)
{
}
语言规则是这样的,这将具有预期的意义

另一种选择是避免使用相同的标识符同时引用成员和函数参数:

terrainType::terrainType(string name_, char symbol_, int freq_)
{
    name=name_;
    symbol=symbol_;
    freq=freq_;
}
另一种选择是使用
this->
作为成员访问的前缀:

terrainType::terrainType(string name, char symbol, int freq)
{
    this->name=name;
    this->symbol=symbol;
    this->freq=freq;
}

构造函数中的三个赋值实际上是无操作(将每个变量赋值给它自己):

问题是,您有两个东西叫做
name
,您希望编译器在
name=name
中找出左侧指的是其中一个,而右侧指的是另一个

解决此问题的最干净方法是更改为构造函数,如下所示:

terrainType::terrainType(string name, char symbol, int freq)
: name(name),
  symbol(symbol),
  freq(freq)
{
}
语言规则是这样的,这将具有预期的意义

另一种选择是避免使用相同的标识符同时引用成员和函数参数:

terrainType::terrainType(string name_, char symbol_, int freq_)
{
    name=name_;
    symbol=symbol_;
    freq=freq_;
}
另一种选择是使用
this->
作为成员访问的前缀:

terrainType::terrainType(string name, char symbol, int freq)
{
    this->name=name;
    this->symbol=symbol;
    this->freq=freq;
}

或者,通过
this->name
等访问数据成员。当然,构造函数中的成员初始化更好。非常感谢。我更改了变量名,效果非常好。这也是我喜欢在数据成员前面加下划线的原因之一。它允许我在函数中使用相同的名称,而不必使用下划线下划线和无需麻烦。或者,通过
this->name
等访问数据成员。当然,构造函数中的成员初始化更好。非常感谢。我更改了变量名,效果非常好。这是我喜欢在数据成员前面加下划线的原因之一。它允许我在函数中使用相同的名称,没有下划线,也没有麻烦。