有没有从C++函数返回多个值的首选方法?例如,假设一个函数分割两个整数并返回商和余数.我经常看到的一种方法是使用参考参数:
void divide(int dividend, int divisor, int& quotient, int& remainder);
Run Code Online (Sandbox Code Playgroud)
一种变化是返回一个值并通过引用参数传递另一个值:
int divide(int dividend, int divisor, int& remainder);
Run Code Online (Sandbox Code Playgroud)
另一种方法是声明一个包含所有结果的结构并返回:
struct divide_result {
int quotient;
int remainder;
};
divide_result divide(int dividend, int divisor);
Run Code Online (Sandbox Code Playgroud)
这些方式中的一种通常是首选,还是有其他建议?
编辑:在现实世界的代码中,可能会有两个以上的结果.它们也可以是不同类型的.
我们遇到了静态初始化命令惨败的一些问题,我正在寻找方法来梳理大量代码以找到可能发生的事件.有关如何有效地做到这一点的任何建议?
编辑:我得到了一些关于如何解决静态初始化顺序问题的好答案,但这不是我的问题.我想知道如何查找受此问题影响的对象.在这方面,Evan的答案似乎是迄今为止最好的答案; 我不认为我们可以使用valgrind,但我们可能有可以执行类似功能的内存分析工具.只有在给定构建的初始化顺序错误的情况下才能捕获问题,并且顺序可以随每个构建而改变.也许有一个静态分析工具可以捕捉到这一点.我们的平台是在AIX上运行的IBM XLC/C++编译器.
我正在为一支乐队的出勤报名表工作.我的想法是让表格的一部分输入表演或排练的事件信息.这是事件表的模型:
class Event(models.Model):
event_id = models.AutoField(primary_key=True)
date = models.DateField()
event_type = models.ForeignKey(EventType)
description = models.TextField()
Run Code Online (Sandbox Code Playgroud)
然后我想要一个内联FormSet,将乐队成员链接到事件并记录它们是否存在,缺席或原谅:
class Attendance(models.Model):
attendance_id = models.AutoField(primary_key=True)
event_id = models.ForeignKey(Event)
member_id = models.ForeignKey(Member)
attendance_type = models.ForeignKey(AttendanceType)
comment = models.TextField(blank=True)
Run Code Online (Sandbox Code Playgroud)
现在,我想做的是预先填充此内联FormSet,其中包含所有当前成员的条目,并默认它们存在(大约60个成员).不幸的是,Django 在这种情况下不允许初始值.
有什么建议?
我似乎在问题和答案中看到比迭代器更多的"for"循环,而不是for_each(),transform()等.Scott Meyers建议使用stl算法,或者至少在2001年做过.当然,使用它们通常意味着将循环体移动到函数或函数对象中.有些人可能觉得这是一种不可接受的并发症,而其他人可能觉得这样可以更好地解决问题.
那么... STL算法应该优于手动循环吗?
我有一个人员表和电话表.Phone表在Person表中有一个外键,它是一个自动增量ID.每个人可以拥有任意数量的电话号码.有没有办法让我创建一个Django表单来输入电话号码,同时创建一个新的Person条目并将其与现有的Person条目一起编辑?
这是一个说明问题的最小代码示例:
#include <iostream>
class Thing
{
// Non-copyable
Thing(const Thing&);
Thing& operator=(const Thing&);
int n_;
public:
Thing(int n) : n_(n) {}
int getValue() const { return n_;}
};
void show(const Thing& t)
{
std::cout << t.getValue() << std::endl;
}
int main()
{
show(3);
}
Run Code Online (Sandbox Code Playgroud)
这会产生相同的错误:
int main()
{
show( Thing(3) );
}
Run Code Online (Sandbox Code Playgroud)
AIX下的IBM XL C/C++ 8.0编译器会发出以下警告:
"testWarning.cpp", line 24.9: 1540-0306 (W) The "private" copy constructor "Thing(const Thing &)" cannot be accessed.
"testWarning.cpp", line 24.9: 1540-0308 (I) The semantics specify that …Run Code Online (Sandbox Code Playgroud) 我有两个int参数的各种函数(我自己编写函数和调用代码).我害怕在一些电话中混淆论证的顺序.
如果我调用一个参数序列错误的函数(所有参数都是int),我怎么能使用类型安全来让编译器警告我或者出错?
我尝试过typedef:Typedef不会触发任何编译器警告或错误:
typedef int X; typedef int Y;
void foo(X,Y);
X x; Y y;
foo(y,x); // compiled without warning)
Run Code Online (Sandbox Code Playgroud) 有一个例子表明以这种方式使用RAII:
class File_ptr{
//...
File* p;
int* i;
public:
File_ptr(const char* n, const char* s){
i=new int[100];
p=fopen(n,a); // imagine fopen might throws
}
~File_ptr(){fclose(p);}
}
void use_file(const char* fn){
File_ptr(fn,"r");
}
Run Code Online (Sandbox Code Playgroud)
是安全的.但我的问题是:如果抛出异常,p=fopen(n,a);那么分配给的内存i不会被返回.这是正确的假设,RAII然后告诉你每次你想要X安全,那么所有获得的资源X必须在堆栈上分配?如果X.a正在创建,那么资源a也必须放在堆栈上?再一次,我的意思是,如果有一些资源放在堆上,如何用RAII处理它?如果它不是我的类,即
我们所有的C++标头都使用.h扩展名.Eclipse认为这些是C头,并在类和命名空间之类的东西上标记了很多语法错误.
我试图改变文件类型关联:
Preferences > C/C++ > File types
Run Code Online (Sandbox Code Playgroud)
但它被"锁定"了.
有趣的是,"*.h"与C和C++标题相关联,但它似乎使用C.我如何让Eclipse将.h文件视为C++?
我更喜欢我的主键字段在我的编辑页面中不可见.如果我将其设置为AutoField,则不会在HTML表单中呈现它.但是主键值也不在我的POST数据中.有没有一种简单的方法将AutoField渲染为隐藏字段?
c++ ×7
django ×3
django-forms ×2
aix ×1
algorithm ×1
eclipse ×1
foreign-keys ×1
forms ×1
ganymede ×1
python ×1
raii ×1
reverse ×1
stl ×1
type-safety ×1