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