由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 老年转行工程师问问C++11基本问题
相关主题
C++虚方法问题问两个关于Emacs的c++补全问题
[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?模板类中的一个类型问题?
Exception类设计的一个问题
哪儿有经典的C++ programing 习题集嘛?c++中把double类型转化为string用那个函数
问个很基础的问题:C++的string子类的assignment operator 怎么访问父类的private member
lambda 什么时候进入 c++的?问个 C++到C的问题
heap 和 stack问题还请教一个关于C++的问题
C++11 unique_ptr问题?dynamic_cast operator in C++
相关话题的讨论汇总
话题: string话题: bb话题: str话题: dd话题: 子类
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
【新问题】
4. boost::format的返回值是string吗,我应该用string&吗?
比如: std::string& str = boost::format(......);
std::cout< throw ... (str);
这样可以省掉一个复制吧?
5. 类UUU的static函数里面
static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
...
就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。
今天reviewer说要我改成把un放到类UUU这一层去,而不是在函数里面。这样就不能避
免启动问题了。而且很麻烦,因为不是简单的整数,浮点数等,是不知道怎么实现的类
(有头文件)。大家说我的做法对不对?另外我这样做是照着其他人写的抄的。有一个
人告诉我这样写好
6. 搜索rvalue reference variable,收到这么一个stackoverflow的问题
struct S { S(const S &) = delete; };
S f();
// S s = f(); // error: no copy or move constructor available
S&&s = f(); // okay
这上面第二行S f();是干啥的?
【老问题】
今天开始写一个新的类BB,继承一个基本的类B。有几个发现
1. 基类B无参数的构造函数(就是default构造函数吧)没有定义,所以子类是不是也应
该没有?还是可以有,看项目需要?
以前是用的子类AA:A,现在要基于B。两个基类有一些区别,也有共性。别人的例子
BBB:B是没有的。
2. 基类B delete拷贝构造函数,子类BB是否需要重写一遍delete?我看别人的例子子类
BBB写了。我如果不写子类BB的拷贝构造函数并delete,默认是delete吗?
3. BB& operator=(BB&& other) 是否需要判断等于自己?有的说既然是临时对象是不
可能等于自己的。甚至应该assert然后报错。而我看别人代码就是B的子类BBB的例子有
判断other是不是自己的代码。请问怎样做是对的?
l*********s
发帖数: 5409
2
1. 没所谓
2. 不需要
3. 需要
L****8
发帖数: 3938
3
delete拷贝构造函数 是个啥东西?
BB& operator=(BB&& other)
如果 other 是自己 return 自己
不需要报错,最多写个warning信息 用于debug

【在 b***i 的大作中提到】
: 【新问题】
: 4. boost::format的返回值是string吗,我应该用string&吗?
: 比如: std::string& str = boost::format(......);
: std::cout<: throw ... (str);
: 这样可以省掉一个复制吧?
: 5. 类UUU的static函数里面
: static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
: ...
: 就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺

b***i
发帖数: 3043
4
4. boost::format的返回值是string吗,我应该用string&吗?
比如: std::string& str = boost::format(......);
std::cout< throw ... (str);
这样可以省掉一个复制吧?
5. 类UUU的static函数里面
static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
...
就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。
今天reviewer说要我改成把un放到类UUU这一层去,而不是在函数里面。这样就不能避
免启动问题了。而且很麻烦,因为不是简单的整数,浮点数等,是不知道怎么实现的类
(有头文件)。大家说我的做法对不对?另外我这样做是照着其他人写的抄的。有一个
人告诉我这样写好。

【在 b***i 的大作中提到】
: 【新问题】
: 4. boost::format的返回值是string吗,我应该用string&吗?
: 比如: std::string& str = boost::format(......);
: std::cout<: throw ... (str);
: 这样可以省掉一个复制吧?
: 5. 类UUU的static函数里面
: static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
: ...
: 就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺

w***g
发帖数: 5958
5
据我的理解, 4的写法是错的. 应该是 string str = boost::format(...).
str = 翻译出来是一个rvalue copy constructor, 应该直接用swap优化了.

考。

【在 b***i 的大作中提到】
: 4. boost::format的返回值是string吗,我应该用string&吗?
: 比如: std::string& str = boost::format(......);
: std::cout<: throw ... (str);
: 这样可以省掉一个复制吧?
: 5. 类UUU的static函数里面
: static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
: ...
: 就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
: 序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。

b***i
发帖数: 3043
6
右边肯定是个临时的字符串。但是,参考是没有问题的,变量会延长参考的生命。
另外我想是否需要左边上const
const string& str = boost::format() .str();

【在 w***g 的大作中提到】
: 据我的理解, 4的写法是错的. 应该是 string str = boost::format(...).
: str = 翻译出来是一个rvalue copy constructor, 应该直接用swap优化了.
:
: 考。

w***g
发帖数: 5958
7
It is not allowed to bind the temporary to a non-const reference, but if you
make your reference const you will extend the lifetime of the temporary to
the reference.

【在 b***i 的大作中提到】
: 右边肯定是个临时的字符串。但是,参考是没有问题的,变量会延长参考的生命。
: 另外我想是否需要左边上const
: const string& str = boost::format() .str();

b***i
发帖数: 3043
8
这样行不行
void someFunc(){
std::string&& errorMessage = boost::format("...").str();
std::cout< LOG }
就在这个函数里面用这个变量

you
to

【在 w***g 的大作中提到】
: It is not allowed to bind the temporary to a non-const reference, but if you
: make your reference const you will extend the lifetime of the temporary to
: the reference.

w***g
发帖数: 5958
9
I don't know. But even if this works, it won't have any significant
performance again anyway. The correct way of writing this should be:
string msg = boost::format("").str();
The point of inventing && is not for you to be able to write
string &&msg =,
Rather, it's for library writers to be able to writing
string::string (string &&) { ...},
or
string::operator = (string &&) { ...},
so that when you write "string msg = " it's as efficient as can be.

【在 b***i 的大作中提到】
: 这样行不行
: void someFunc(){
: std::string&& errorMessage = boost::format("...").str();
: std::cout<: LOG: }
: 就在这个函数里面用这个变量
:
: you
: to

b***i
发帖数: 3043
10
我觉得应该是
auto&& errorMessage = boost::format("").str();
据说连constness也保持了。

【在 w***g 的大作中提到】
: I don't know. But even if this works, it won't have any significant
: performance again anyway. The correct way of writing this should be:
: string msg = boost::format("").str();
: The point of inventing && is not for you to be able to write
: string &&msg =,
: Rather, it's for library writers to be able to writing
: string::string (string &&) { ...},
: or
: string::operator = (string &&) { ...},
: so that when you write "string msg = " it's as efficient as can be.

L****8
发帖数: 3938
11
const auto&

【在 b***i 的大作中提到】
: 我觉得应该是
: auto&& errorMessage = boost::format("").str();
: 据说连constness也保持了。

1 (共1页)
进入Programming版参与讨论
相关主题
dynamic_cast operator in C++问个很基础的问题:C++的string
问个C++中重复删除指针的问题lambda 什么时候进入 c++的?
请问2个类的问题heap 和 stack问题
内存管理的问题C++11 unique_ptr问题?
C++虚方法问题问两个关于Emacs的c++补全问题
[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?模板类中的一个类型问题?
Exception类设计的一个问题
哪儿有经典的C++ programing 习题集嘛?c++中把double类型转化为string用那个函数
相关话题的讨论汇总
话题: string话题: bb话题: str话题: dd话题: 子类