如何将C++外部类中内部类的变量存入外部类的二维vector?
问题排查与解决方法
我帮你梳理了代码里的几个关键错误,一个个拆解来看:
1. 构造函数名称不匹配
你在Outer类里声明的构造函数写成了PegSolitaire(vector<vector<inner>>cvect);,但构造函数的名字必须和类名完全一致,应该改成Outer(vector<vector<inner>>cvect);。
2. 构造函数赋值逻辑颠倒
在构造函数的定义中,你写了cvect=vect;——这是把类的私有成员vect的值赋给参数cvect,完全搞反了赋值方向。正确的写法应该是把传入的参数赋值给类成员:vect = cvect;。
3. send_into_vector函数的双重错误
这个函数里有两个核心问题:
- 你直接使用了
a,但函数内部并没有定义Outer::inner类型的对象a,需要先创建这个对象,或者把它作为参数传入函数; vect是vector<vector<Outer::inner>>类型的二维容器,你直接push_back(a.get_i1)完全不符合类型要求:一是get_i1是成员函数,你没加括号调用;二是就算调用了,返回的是int,和容器元素类型vector<Outer::inner>不匹配。你需要先构建一个vector<Outer::inner>类型的行,再把inner对象放进去,最后添加到二维容器中。
4. 外部定义成员函数的类型限定缺失
在定义getVector函数时,返回类型vector<vector<inner>>需要明确inner是Outer的内部类,应该写成vector<vector<Outer::inner>>,否则编译器找不到inner的定义。
修正后的完整代码
#include <iostream> #include <vector> using namespace std; class Outer{ public: // 修正构造函数名称 Outer(vector<vector<inner>>cvect); // 修改为接收inner对象作为参数 void send_into_vector(const inner& a); vector<vector<inner>> getVector(); class inner{ public: int get_i1(); int get_i2(); void set(int io,int it); private: int i1; int i2; }; private: vector<vector<inner>> vect; }; // 内部类成员函数定义 int Outer::inner::get_i1(){ return i1; } int Outer::inner::get_i2(){ return i2; } void Outer::inner::set(int io,int it){ i1 = io; i2 = it; } // 修正返回类型的内部类限定 vector<vector<Outer::inner>> Outer::getVector(){ return vect; } // 修正构造函数赋值逻辑 Outer::Outer(vector<vector<inner>>cvect){ vect = cvect; } // 修正send_into_vector逻辑:将inner对象存入二维vector的新行 void Outer::send_into_vector(const Outer::inner& a){ vector<Outer::inner> row; row.push_back(a); vect.push_back(row); // 如果你的需求是把i1和i2拆成两个inner对象存入同一行,可以用这段代码: // Outer::inner temp1, temp2; // temp1.set(a.get_i1(), 0); // temp2.set(0, a.get_i2()); // vector<Outer::inner> row; // row.push_back(temp1); // row.push_back(temp2); // vect.push_back(row); } int main() { Outer::inner a; a.set(1,2); // 示例使用:创建Outer对象并存入inner数据 vector<vector<Outer::inner>> initVect; Outer outerObj(initVect); outerObj.send_into_vector(a); // 验证存入结果 auto result = outerObj.getVector(); if(!result.empty() && !result[0].empty()){ cout << "i1: " << result[0][0].get_i1() << ", i2: " << result[0][0].get_i2() << endl; } return 0; }
额外说明
如果你的需求是把inner对象的i1和i2分别作为独立元素存入二维vector,而不是存入整个inner对象,可以启用代码里注释的那段逻辑,核心是要严格匹配二维容器的类型结构:外层是vector,每个元素是vector<Outer::inner>,所以每次添加的要么是完整的一行vector<inner>,要么是往已有的行里添加inner对象。
内容的提问来源于stack exchange,提问作者Vito Metvet
相关产品推荐
相关产品推荐

