C++ 如何在C++;

C++ 如何在C++;,c++,reference,C++,Reference,例如,如果我在一个函数中创建了一个新对象,并且我想返回它的引用,我该怎么做呢 假设我得到了一个IntClass,它在private中有一个“int num”字段。因此,我想在函数中创建IntClass的新元素,并返回该对象的引用。我尝试过类似的方法,但似乎不合法(出于某种原因,当我这样做时,二进制文件会在编译代码时被删除,尽管编译器本身(ECLIPSE)没有错误): 那么,你知道如何返回推荐信吗 编辑:允许“假定”C++使用垃圾回收< /P> 因为你们大多数人都不清楚我为什么“想”这么做,所以这

例如,如果我在一个函数中创建了一个新对象,并且我想返回它的引用,我该怎么做呢

假设我得到了一个IntClass,它在private中有一个“int num”字段。因此,我想在函数中创建IntClass的新元素,并返回该对象的引用。我尝试过类似的方法,但似乎不合法(出于某种原因,当我这样做时,二进制文件会在编译代码时被删除,尽管编译器本身(ECLIPSE)没有错误):

那么,你知道如何返回推荐信吗

<>编辑:允许“假定”C++使用垃圾回收< /P> 因为你们大多数人都不清楚我为什么“想”这么做,所以这里有一个完整的问题:

我得到了这个文件(不是我做的,不能编辑):

poly_subtype.h

#ifndef POLY_SUBTYPE_H
#define POLY_SUBTYPE_H
#include <iostream>
#include "cpu_add.h"
using std::cout;
using std::endl;

//Deriving classes definition
class IntClass;
class DoubleClass;

//The Virtual Number Class. IntClass and FloatClass will derive from this class.
class Number {
    public:
        //return a Number object that's the results of x+this, when x is DoubleClass
        virtual Number& addDouble(DoubleClass& x) = 0;

        //return a Number object that's the results of x+this, when x is IntClass
        virtual Number& addInt(IntClass& x) = 0;

        //return a Number object that's the results of x+this, when x is either
        //IntClass or DoubleClass
        virtual Number& operator+(Number& x) = 0;

        //Print the number stored in the object
        virtual void print_number() = 0;
};

class IntClass : public Number {
    private:
        int my_number;
    public:
        //Constructor
        IntClass(int n):my_number(n) {}

        //returns the number stored in the object
        int get_number()  {return my_number;}

        //print the number stored in the object
        void print_number() {cout << my_number << endl;}

        //return a DoubleClass object that's the result of x+this
        Number& addDouble(DoubleClass& x);

        //return an IntClass object that's the result of x+this
        Number& addInt(IntClass& x);

        //return a Number object that's the result of x+this.
        //The actual class of the returned object depends on x.
        //If x is IntClass, then the result if IntClass.
        //If x is DoubleClass, then the results is DoubleClass.
        Number& operator+(Number& x);
};

class DoubleClass : public Number {
    private:
        double my_number;
    public:
        //Constructor
        DoubleClass(double n):my_number(n) {}

        //returns the number stored in the object
        double get_number()  {return my_number;}

        //Print the number stored in the object
        void print_number() {cout << my_number << endl;}

        //return a DoubleClass object that's the result of x+this
        Number& addDouble(DoubleClass& x);

        //return a DoubleClass object that's the result of x+this
        Number& addInt(IntClass& x);

        //return a DoubleClass object that's the result of x+this.
        //This should work if x is either IntClass or DoubleClass
        Number& operator+( Number& x);
};

#endif
Number& IntClass::addInt(IntClass& x){
 int num = add_int_int(my_number, x.get_number());
 IntClass* a = new IntClass(num);
 IntClass &ref = *a;
 return ref;
}
我的目标是实现下面的函数(您可以在上面的poly_subtype.h中找到它们的声明和功能):

我希望现在更清楚了

例如,附加内容

#ifndef POLY_SUBTYPE_H
#define POLY_SUBTYPE_H
#include <iostream>
#include "cpu_add.h"
using std::cout;
using std::endl;

//Deriving classes definition
class IntClass;
class DoubleClass;

//The Virtual Number Class. IntClass and FloatClass will derive from this class.
class Number {
    public:
        //return a Number object that's the results of x+this, when x is DoubleClass
        virtual Number& addDouble(DoubleClass& x) = 0;

        //return a Number object that's the results of x+this, when x is IntClass
        virtual Number& addInt(IntClass& x) = 0;

        //return a Number object that's the results of x+this, when x is either
        //IntClass or DoubleClass
        virtual Number& operator+(Number& x) = 0;

        //Print the number stored in the object
        virtual void print_number() = 0;
};

class IntClass : public Number {
    private:
        int my_number;
    public:
        //Constructor
        IntClass(int n):my_number(n) {}

        //returns the number stored in the object
        int get_number()  {return my_number;}

        //print the number stored in the object
        void print_number() {cout << my_number << endl;}

        //return a DoubleClass object that's the result of x+this
        Number& addDouble(DoubleClass& x);

        //return an IntClass object that's the result of x+this
        Number& addInt(IntClass& x);

        //return a Number object that's the result of x+this.
        //The actual class of the returned object depends on x.
        //If x is IntClass, then the result if IntClass.
        //If x is DoubleClass, then the results is DoubleClass.
        Number& operator+(Number& x);
};

class DoubleClass : public Number {
    private:
        double my_number;
    public:
        //Constructor
        DoubleClass(double n):my_number(n) {}

        //returns the number stored in the object
        double get_number()  {return my_number;}

        //Print the number stored in the object
        void print_number() {cout << my_number << endl;}

        //return a DoubleClass object that's the result of x+this
        Number& addDouble(DoubleClass& x);

        //return a DoubleClass object that's the result of x+this
        Number& addInt(IntClass& x);

        //return a DoubleClass object that's the result of x+this.
        //This should work if x is either IntClass or DoubleClass
        Number& operator+( Number& x);
};

#endif
Number& IntClass::addInt(IntClass& x){
 int num = add_int_int(my_number, x.get_number());
 IntClass* a = new IntClass(num);
 IntClass &ref = *a;
 return ref;
}

您的示例代码是一个等待发生的内存泄漏。对象完成后,谁负责删除该对象?返回引用(而不是指针)的事实更不明显的是,堆上已经分配了一个对象。在某个时候,有人需要执行
delete&obj;
,这是非常反常的

通常,您应该只返回对其他地方引用的对象的引用(例如类成员或类成员指向的堆对象)。在您的特定情况下,您可能最好执行以下操作:

IntClass myFunc()
{
    ...
    return IntClass(10);
}

i、 e.按值返回。

为什么首先要返回引用?只返回值而不是引用。如果您担心的话,编译器通常会优化副本


<> P>参见有效C++,第21项。

当您可以做上面写的东西时,这是一个坏的步骤。如果在空闲存储区分配了资源,则应该返回指向它的指针,而不是引用。更好的是,使用适当类型的智能指针:例如:代码> STD::AutoPosithPosith<代码>(或更好的<代码> STD/Booo::UNIQUYYPTR )如果资源不由制作人持有,并且

std::shared_ptr
情况正好相反。您的代码示例是合法的,但返回引用的使用者不(也不能)知道如何处理返回的引用

我可以想象在这样的场景中返回对对象的常量引用:

class Producer {
 std::shared_ptr<SomeObject> mObject;

public:
 Producer() : mObject(new SomeObject) {}

 const SomeObject& GetObject() const {
  return *mObject;
 }

};
干杯


保罗

哦,我现在明白了。你应该实现一个变异操作来修改'this'对象a并返回对它的引用。所以它就像:

Number& YourNumber::Add(const YourNumber& pX) {
 // do addition which mutates this...
 return *this;
}

我被允许“假设”C++使用垃圾回收。这不是为什么我想返回引用——我被要求这样做,我不知道如何去做它(即使通常你不会在我的代码中这样做)@用户:这必须是最愚蠢的假设之一:)@ USE550413: C++没有垃圾收集器,所以通过假设,你最终会得到完全崩溃的代码。这里没有人会帮你写坏代码!我可以给他的名字命名为:D,但正如我所说,当我在代码中包含这个函数时(是的,我知道这是错误的,并且C++中没有垃圾收集器),二进制文件消失了。你说这是因为X?@user550413先生愚蠢的假设:当你重新编译时,二进制文件总是消失,只是如果编译和链接成功,它们就会被重新创建。显然,某个地方存在编译/链接器错误。这不是我想要返回引用的原因-我被要求返回引用,但我不知道如何返回(即使通常在我的代码中您不会这样做)。此外,正如我上面所说的,内存泄漏在我的问题中并不是一个问题,因为我被允许“假定”C++使用垃圾收集。那么,有没有方法返回对对象的引用,而不是复制或指针?@user:Who让您这样做?如果您确实坚持返回对动态分配对象的引用,那么您已经在问题中给出了答案。这个代码应该工作,只是任何严肃的C++程序员在你的脸上吐出的东西都会被看到。”FredOverflow:我可以说出他的名字:D,但是正如我在代码中包含这个函数时所说的(是的,我知道它是错误的,C++中没有垃圾收集器),二进制文件就消失了。你说这是因为X先生愚蠢的假设?用户:什么?不,你的IDE可能有问题。没有C++编译器会因为你做的不习惯而删除二进制。@ FredOverflow:我试过重新安装,但仍然有同样的问题。如果我将函数作为注释插入,似乎一切都正常。如果我将其从注释中取出并编译二进制文件,则二进制文件将消失,如果我再次将其作为注释插入并编译二进制文件,则二进制文件将返回!允许“假设”C++通过伊柯丽斯不是编译器的方式使用垃圾收集。它是IDE:)为什么不通过引用传递IntClass?void f(IntClass&ref)您是否尝试过在没有IDE的情况下手动编译源代码?您的代码看起来有效,甚至
return*(新的IntClass(10))
返回*a在我看来是有效的。也许二进制文件消失的原因与这个特殊问题无关,而真正的错误在别处。C++默认没有垃圾收集。有一些库在执行,但在大多数C++项目中没有垃圾回收器。事实上,你通常可以“假定”C++没有GC。是的,我知道这是一个坏的风格,就像我说的那样,我不会正常地去做。我用“static SomeObject”尝试了您的上一个建议,再次像在我自己的代码中一样,在使用此函数编译代码时,二进制文件被删除,然后在尝试运行main时出现“Binary Not Found”错误。代码本身没有错误。我不知道这两个词之间有什么联系
SomeObject& GetSomeObjectSingletonReference() {
 static SomeObject sInstance;
 return sInstance;
}
Number& YourNumber::Add(const YourNumber& pX) {
 // do addition which mutates this...
 return *this;
}