来自朋友 class 在赋值操作中的数组正在被操作
array from friend class in assignment operation is being manipulated
我有一个名为 Map
的 class,声明如下:
class Map {
public:
void get_world_size(const double val);
void get_landmarks(const double array[][2], int val);
void print_map();
private:
int num_landmarks;
double world_size;
double landmarks[][2];
friend class Robot;
};
我已经将 Robot
定义为好友 class。为了避免在 Robot
对象中有显式构造函数,我将私有属性复制到 Robot
class as
void Robot::get_world_size(const Map map){
this->world_size = map.world_size;
}
void Robot::get_landmarks(const Map map){
this->num_landmarks = map.num_landmarks;
for(int i = 0; i < this->num_landmarks; i++){
if (i == 0) {
std::cout << "The map landmarks are being copied to robot landmarks..." << std::endl;
}
this->landmarks[i][0] = map.landmarks[i][0];
this->landmarks[i][1] = map.landmarks[i][1];
std::cout << " Landmark " << i << " = " << map.landmarks[i][0] << "\t" << map.landmarks[i][1] << " is copied!" << std::endl;
}
}
至少有两个问题我不能完全理解:(1)在Robot
class中,属性double landmarks[][2]
抛出:
In copy constructor ‘constexpr Robot::Robot(const Robot&)’:
.../Robot.h:41:12: error: initializer for flexible array member ‘double Robot::landmarks [][2]’
41 | double landmarks[][2];
而且即使我很天真地定义为double landmarks[8][2]
来摆脱这个错误,赋值的内容也是错误的,即for
Map map;
// Map size in meters
int map_size = 100;
map.get_world_size(map_size);
int num_landmarks = 8;
double landmarks[8][2] = { { 20.0, 20.0 }, { 20.0, 80.0 }, { 20.0, 50.0 },
{ 50.0, 20.0 }, { 50.0, 80.0 }, { 80.0, 80.0 },
{ 80.0, 20.0 }, { 80.0, 50.0 } };
map.get_landmarks(landmarks, num_landmarks);
map.print_map();
//Practice Interfacing with Robot Class
Robot myrobot;
myrobot.get_world_size(map);
myrobot.get_landmarks(map);
myrobot.print_robot();
我在 print_robot
方法中得到非常奇怪的结果:
20 20
20 80
20 50
50 20
50 80
80 80
80 20
80 50
Robot indicates the world size as: 100
The map landmarks are being copied to robot landmarks...
Landmark 0 = 0 1.6976e-313 is copied!
Landmark 1 = 6.91261e-310 100 is copied!
Landmark 2 = 20 20 is copied!
Landmark 3 = 20 80 is copied!
Landmark 4 = 20 50 is copied!
Landmark 5 = 50 20 is copied!
Landmark 6 = 50 80 is copied!
Landmark 7 = 80 80 is copied!
你能帮帮我吗?
编辑:问题如回复中提到的错误初始化。
double landmarks[][2];
不是合法的 C++。仅当您直接初始化它时才允许这样的声明,然后省略的大小将由初始化列表的大小定义。
我有一个名为 Map
的 class,声明如下:
class Map {
public:
void get_world_size(const double val);
void get_landmarks(const double array[][2], int val);
void print_map();
private:
int num_landmarks;
double world_size;
double landmarks[][2];
friend class Robot;
};
我已经将 Robot
定义为好友 class。为了避免在 Robot
对象中有显式构造函数,我将私有属性复制到 Robot
class as
void Robot::get_world_size(const Map map){
this->world_size = map.world_size;
}
void Robot::get_landmarks(const Map map){
this->num_landmarks = map.num_landmarks;
for(int i = 0; i < this->num_landmarks; i++){
if (i == 0) {
std::cout << "The map landmarks are being copied to robot landmarks..." << std::endl;
}
this->landmarks[i][0] = map.landmarks[i][0];
this->landmarks[i][1] = map.landmarks[i][1];
std::cout << " Landmark " << i << " = " << map.landmarks[i][0] << "\t" << map.landmarks[i][1] << " is copied!" << std::endl;
}
}
至少有两个问题我不能完全理解:(1)在Robot
class中,属性double landmarks[][2]
抛出:
In copy constructor ‘constexpr Robot::Robot(const Robot&)’:
.../Robot.h:41:12: error: initializer for flexible array member ‘double Robot::landmarks [][2]’
41 | double landmarks[][2];
而且即使我很天真地定义为double landmarks[8][2]
来摆脱这个错误,赋值的内容也是错误的,即for
Map map;
// Map size in meters
int map_size = 100;
map.get_world_size(map_size);
int num_landmarks = 8;
double landmarks[8][2] = { { 20.0, 20.0 }, { 20.0, 80.0 }, { 20.0, 50.0 },
{ 50.0, 20.0 }, { 50.0, 80.0 }, { 80.0, 80.0 },
{ 80.0, 20.0 }, { 80.0, 50.0 } };
map.get_landmarks(landmarks, num_landmarks);
map.print_map();
//Practice Interfacing with Robot Class
Robot myrobot;
myrobot.get_world_size(map);
myrobot.get_landmarks(map);
myrobot.print_robot();
我在 print_robot
方法中得到非常奇怪的结果:
20 20
20 80
20 50
50 20
50 80
80 80
80 20
80 50
Robot indicates the world size as: 100
The map landmarks are being copied to robot landmarks...
Landmark 0 = 0 1.6976e-313 is copied!
Landmark 1 = 6.91261e-310 100 is copied!
Landmark 2 = 20 20 is copied!
Landmark 3 = 20 80 is copied!
Landmark 4 = 20 50 is copied!
Landmark 5 = 50 20 is copied!
Landmark 6 = 50 80 is copied!
Landmark 7 = 80 80 is copied!
你能帮帮我吗?
编辑:问题如回复中提到的错误初始化。
double landmarks[][2];
不是合法的 C++。仅当您直接初始化它时才允许这样的声明,然后省略的大小将由初始化列表的大小定义。