Python代码转C++时existItem方法编译错误求助
Python转C++代码编译错误修复
原Python代码(books.py)
class Person(object): def __init__(self, user=None, age=None): self.user = user self.age=age class Room(object): def __init__(self, spaces=[0,0,0,0,0], keysC=[0,0,0,0], accounts=0): self.spaces = spaces self.keysC = keysC self.accounts = accounts class StudyRoom(object): def __init__(self): self.start = Room() self.start2 = Room() self.insert = Person() self.link = Room() self.piv = False self.exist = False self.exist2 = False def existItem(self, keyC, root): value =0 if(keyC.age < root.keysC[0].age): self.exist2 = False value = 0 else: value = root.accounts while (keyC.age < root.keysC[value - 1].age and value > 1): value-=1 return value
转换后的C++错误代码(books.cpp)
#include <iostream> #include <string> using namespace std; #include <vector> class Person { public: string user; int age; Person(string user = nullptr, int age = 0){ this->user = user; this->age = age; } }; class Room { public: int accounts; vector<int> spaces; vector<int> keysC; Room(vector<int> spaces = {0,0,0,0,0}, vector<int> keysC = {0,0,0,0}, int accounts = 0){ this->spaces = spaces; this->keysC = keysC; this->accounts = accounts; } }; class StudyRoom { public: Room *start, *start2, *link; Person *insert; bool piv, exist, exist2; StudyRoom(){ this->start = new Room(); this->start2 = new Room(); this->insert = new Person(); this->link = new Room(); this->piv = false; this->exist = false; this->exist2 = false; } int existItem(Person* keyC, Room* root){ int value = 0; if (keyC->age < root->keysC[0]->age)//error #1 { this->exist2 = false; value = 0; } else { value = root->accounts; while (keyC->age < root->keysC[value - 1]->age && value > 1)//error #2 { value = 1; } } return value; } };
编译错误信息
首次错误(使用->访问时)
books.cpp: In member function 'int StudyRoom::existItem(Person*, Room*)': books.cpp:52:39: error: base operand of '->' is not a pointer 52 | if (keyC->age < root->keysC[0]->age)//error #1 | ^~ books.cpp:60:54: error: base operand of '->' is not a pointer 60 | while (keyC->age < root->keysC[value - 1]->age && value > 1)//error #2 | ^~
修改->为.后的错误
books.cpp: In member function 'int StudyRoom::existItem(Person*, Room*)': books.cpp:52:40: error: request for member 'age' in 'root->Room::keysC.std::vector<int>::operator[](0)', which is of non-class type '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} 52 | if (keyC->age < root->keysC[0].age)//error #1 | ^~~ books.cpp:60:55: error: request for member 'age' in 'root->Room::keysC.std::vector<int>::operator[](((std::vector<int>::size_type)(value - 1)))', which is of non-class type '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} 60 | while (keyC->age < root->keysC[value - 1].age && value > 1)//error #2 | ^~~
错误原因与修复方案
核心问题
原Python代码中Room类的keysC是Person对象的列表,但转换到C++时被错误定义为vector<int>,导致无法访问age成员(int类型无该属性)。同时存在两处细节错误:
Person构造函数中,string类型默认参数用nullptr非法,需改为空字符串existItem的while循环中,错误将value -=1写成value =1
修复后的可编译代码
#include <iostream> #include <string> #include <vector> using namespace std; class Person { public: string user; int age; // 修正string默认参数为合法的空字符串 Person(string user = "", int age = 0){ this->user = user; this->age = age; } }; class Room { public: int accounts; vector<int> spaces; // 将keysC改为Person对象的vector,匹配原Python逻辑 vector<Person> keysC; // 调整keysC默认参数为4个默认Person对象 Room(vector<int> spaces = {0,0,0,0,0}, vector<Person> keysC = {Person(), Person(), Person(), Person()}, int accounts = 0){ this->spaces = spaces; this->keysC = keysC; this->accounts = accounts; } }; class StudyRoom { public: Room *start, *start2, *link; Person *insert; bool piv, exist, exist2; StudyRoom(){ this->start = new Room(); this->start2 = new Room(); this->insert = new Person(); this->link = new Room(); this->piv = false; this->exist = false; this->exist2 = false; } int existItem(Person* keyC, Room* root){ int value = 0; // 现在keysC是Person对象的vector,用.访问age成员 if (keyC->age < root->keysC[0].age) { this->exist2 = false; value = 0; } else { value = root->accounts; // 修正while循环的value递减逻辑,和Python保持一致 while (keyC->age < root->keysC[value - 1].age && value > 1) { value -= 1; } } return value; } }; // 可选:添加main函数验证编译 int main() { StudyRoom sr; return 0; }
额外说明
若需使用指针类型的vector<Person*>,需将构造函数默认参数改为{new Person(), new Person(), new Person(), new Person()},并注意后续手动释放内存避免泄漏。上述代码使用值类型vector<Person>更简洁,符合原Python语义。
内容的提问来源于stack exchange,提问作者asker
相关产品推荐
相关产品推荐

