我已经看到很多论据,使用返回值比out参数更可取.我确信为什么要避免它们,但我发现自己不确定我是否遇到了不可避免的情况.
我的问题的第一部分是:你最喜欢/常见的使用out参数的方法是什么?沿着这条线:人,在同行评议中,我总是看到其他程序员在这样做的时候可以轻松完成.
我的问题的第二部分涉及我遇到的一些特定情况,我想避免使用out参数,但却想不到干净的方法.
示例1:我有一个昂贵的副本,我想避免.可以在对象上完成工作,这会使对象的构建变得昂贵.建立数据的工作也不是很简单.目前,我将此对象传递给将修改对象状态的函数.对我来说,最好是新建一个工作函数内部的对象并将其返回,因为它允许我把东西放在堆栈上.
class ExpensiveCopy //Defines some interface I can't change.
{
public:
ExpensiveCopy(const ExpensiveCopy toCopy){ /*Ouch! This hurts.*/ };
ExpensiveCopy& operator=(const ExpensiveCopy& toCopy){/*Ouch! This hurts.*/};
void addToData(SomeData);
SomeData getData();
}
class B
{
public:
static void doWork(ExpensiveCopy& ec_out, int someParam);
//or
// Your Function Here.
}
Run Code Online (Sandbox Code Playgroud)
使用我的函数,我得到这样的代码:
const int SOME_PARAM = 5;
ExpensiveCopy toModify;
B::doWork(toModify, SOME_PARAM);
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:
ExpensiveCopy theResult = B::doWork(SOME_PARAM);
Run Code Online (Sandbox Code Playgroud)
但我不知道这是否可行.
第二个例子:我有一个对象数组.数组中的对象是一个复杂的类型,我需要对每个元素进行处理,我希望将它与访问每个元素的主循环分开.代码目前看起来像这样:
std::vector<ComplexType> theCollection;
for(int index = 0; index < theCollection.size(); ++index)
{ …Run Code Online (Sandbox Code Playgroud) 是否存在部分覆盖基类定义的一组虚函数的问题?
我的编译器提供以下警告:
overloaded virtual function "MyBaseClass::setValue" is only partially overridden in class "MyDerivedClass".
Run Code Online (Sandbox Code Playgroud)
这些类看起来像这样:
class MyBaseClass
{
public:
virtual void setValue(int);
virtual void setValue(SpecialType*);
}
class MyDerivedClass : public MyBaseClass
{
public:
virtual void setValue(int);
}
Run Code Online (Sandbox Code Playgroud)
摆脱此警告的简单方法是为基本函数使用不同的名称,但我想知道是否有任何令人信服的理由来修复此特定警告.我不相信这违反了C++标准.我的猜测是警告程序员他们可能忘记为所有可能的输入类型实现行为.在我们的例子中,有意排除某些特定类型.
你会劝阻完全压制这个警告吗?
更新:编辑代码示例以使用AutoA进行解决方法(这是最初的意图).在看到rlbond的回答后意识到了这一点.
我正在尝试auto_ptr根据此线程的建议合并我的代码中的用法:
但是,在使用Visual Studio 6.0进行编译时,我收到了一些意外的编译错误.在处理std::auto_ptr派生类型的赋值/副本到std::auto_ptr基本类型的a时,它有一个问题.这是我的编译器特有的问题吗?
我知道强烈建议使用Boost,但在我的项目中它不是一个选项.如果我还想使用auto_ptr,我是否被迫使用调用方法std::auto_ptr::release()?从我到目前为止遇到的情况来看,这个问题会导致编译错误,因此很容易捕获.但是,可以采用调用release的约定来分配基类型的'auto_ptr',从而使我遇到任何维护问题吗?特别是如果使用不同的编译器构建(假设其他编译器没有这个问题).
如果release()由于我的情况导致解决方法不好,我是否应该使用不同的约定来描述所有权转移?
以下是说明该问题的示例.
#include "stdafx.h"
#include <memory>
struct A
{
int x;
};
struct B : public A
{
int y;
};
typedef std::auto_ptr<A> AutoA;
typedef std::auto_ptr<B> AutoB;
void sink(AutoA a)
{
//Some Code....
}
int main(int argc, char* argv[])
{
//Raws to auto ptr
AutoA a_raw_to_a_auto(new A());
AutoB b_raw_to_b_auto(new B());
AutoA b_raw_to_a_auto(new B());
//autos to same type autos
AutoA a_auto_to_a_auto(a_raw_to_a_auto);
AutoB …Run Code Online (Sandbox Code Playgroud)