0

我有一个如下所示的头文件:

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。我相信这是因为它不知道坐标类型,因为它是在类头中声明的。我可以通过在类之外声明结构来解决这个问题,但我想知道是否可以按照我的方式做,或者这通常被认为是不好的做法

4

3 回答 3

2

您将需要一个隐式转换运算符Model::coordto c。有关如何执行此操作的信息,我建议查看C++ Implicit Conversion Operators

此外,当您提到“它不知道类型,因为它在一个类中”时,您将Model::coord用作外部世界的结构类型(只要coord是公共的,在您当前的情况下不是)。

于 2012-04-14T05:26:10.043 回答
1

您提供的代码有两个主要问题:
1. 您没有给出从struct coordto的转换struct c
2.你不能struct coord在外面使用,class Model因为它被声明为私有的。

  1. 即使struct coordstruct c相似,编译器的通灵能力也非常有限。对于编译器来说,这两个结构是不同的,即使它们本质上是一样的。解决这个问题的一种方法是提供struct c一个适当的赋值运算符,它采用以下类型struct coord

    strutc c {  
        ...  
        void operator = (const coord& rhs) { ... }  
    };  
    
  2. 您必须struct coord公开更多才能在外面使用class Model
    您可以通过以下方式做到这一点:
    a)struct coord在类 Model 之外声明或
    b)在类 Model 内将其声明为 public

    如果您执行后者,则必须使用限定名称Model::coord来访问该结构。

备注:
考虑改变方法

    coord Model::get() const;  

    const coord& Model::get() const;  

一个微妙的变化会产生很大的不同。struct coord这节省了堆栈上 的隐式构造。

考虑改变运营商

    void c::operator = (c &rhs);  

    void c::operator = (const c& rhs);  

因为赋值运算符不会改变给定的参数结构 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; };
};  
于 2012-04-14T08:38:12.667 回答
0

添加一个带坐标的 c 构造函数足以使编译器进行转换。现在为什么你有两种不同的类型呢?将这个坐标类从模型中分解出来并在两个点上都使用它们不是更好吗?

于 2012-04-14T05:50:19.150 回答