我有一个类似于以下内容的头文件:
class Model {
private:
struct coord {
int x;
int y;
} xy;
public:
....
coord get() const {
return xy;
}
};
在另一个文件中(假设ModelObject存在):
struct c {
int x;
int y;
void operator = (c &rhs) {
x = rhs.x;
y = rhs.y;
};
} xy;
xy = ModelObject->get();
编译器抛出一个错误,指出从coord到c没有已知的covnersion。 我相信这是因为它不知道coord类型,因为它是在类头中声明的。我可以通过在类之外声明结构来解决这个问题,但我想知道是否有可能按照我的方式行事,或者这通常被认为是不好的做法
答案 0 :(得分:2)
您需要Model::coord
到c
的隐式转换运算符。有关如何执行此操作的信息,建议您查看C++ Implicit Conversion Operators。
另外,当你提到“它不知道类型,因为它在一个类中”时,你会使用Model::coord
作为外部世界的结构类型(只要coord
是公开的,在你目前的情况下,它不是。)
答案 1 :(得分:1)
您提供的代码有两个主要问题:
1.您尚未从struct coord
转换为struct c
2.您不能在struct coord
之外使用class Model
,因为它被声明为私有。
即使struct coord
和struct c
相似,编译器也具有非常有限的精神力量。对于编译器,即使两个结构基本相同,它们也是不同的。解决此问题的一种方法是为struct c
提供一个足够的分配运算符,其类型为struct coord
:
strutc c {
...
void operator = (const coord& rhs) { ... }
};
您必须在struct coord
之外更多地公开class Model
你可以这样做:
a)在类Model或
之外声明struct coord
b)在类Model
如果您执行后者,则必须使用限定名称Model::coord
来访问结构。
说明:
考虑更改方法
coord Model::get() const;
到
const coord& Model::get() const;
微妙的变化会产生重大影响。这样可以在堆栈上保存struct coord
的隐式构造。
考虑更改运算符
void c::operator = (c &rhs);
到
void c::operator = (const c& rhs);
因为赋值运算符不会更改给定的参数struct c Const正确性不仅仅是语法糖,而且是强制性的,它提高了可读性。
所以这是我的建议:
class Model {
public:
struct coord {
int x; int y;
};
private:
coord xy;
public:
const coord& get() const { return xy; }
};
struct c {
int x; int y;
void operator = (const c &rhs) { x = rhs.x; y = rhs.y; };
void operator = (const Model::coord &rhs) { x = rhs.x; y = rhs.y; };
};
答案 2 :(得分:0)
使用coord添加c的构造函数足以使编译器执行转换。现在为什么你有 2 不同的类型呢?将这个coord类从模型中分解出来并在两个点使用它们不是更好吗?