从类方法返回结构

时间:2012-04-14 05:25:00

标签: c++ struct operator-overloading

我有一个类似于以下内容的头文件:

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您提供的代码有两个主要问题:
 1.您尚未从struct coord转换为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)在类Model或
    之外声明struct coord b)在类Model

    中声明它是公开的

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

  3. 说明:
    考虑更改方法

        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类从模型中分解出来并在两个点使用它们不是更好吗?