例如这是正确的:
class C
{
private:
C();
C(const & C other);
}
Run Code Online (Sandbox Code Playgroud)
或者您应该提供定义:
class C
{
private:
C() {};
C(const & C other) {};
}
Run Code Online (Sandbox Code Playgroud)
?谢谢你目前的答案.让我们扩展这个问题 - 编译器是否在其中一个示例中生成了更好的代码?我可以想象为ctor强制编译器提供体在编译单元中包含一些(空)代码?这对于自动生成的代码也是如此吗?
c++ constructor declaration copy-constructor default-constructor
我刚刚发现,当涉及到模板时,这个代码在g ++ 3.4.2中编译,并且除非不调用m(),否则它可以工作:
template <typename T>
class C
{
T e;
public:
C(): e(0) {};
void m()
{
e = 0;
};
};
Run Code Online (Sandbox Code Playgroud)
现在可以创建和使用实例
C<const int> c;
Run Code Online (Sandbox Code Playgroud)
直到c.m()没有被称为没有编译错误,但这是合法的吗?
一旦我运行我的代码(请注意我只使用C,没有QT和没有C++),我从IDE中的应用程序输出中获得以下消息:
无法获得劣质的句柄:参数不正确.
当我删除makefile和debug/release文件夹时它正在运行,但过了一段时间后我仍然收到错误.这不是一个问题,代码运行,一切都很好,但这个错误弹出,这是非常烦人的.
.pro文件的内容是:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
QMAKE_CC = gcc -std=c99
SOURCES += main.c
Run Code Online (Sandbox Code Playgroud)
提前致谢!
编辑:我添加了C++标记,因为在我的情况下,C++控制台应用程序也会发生此错误.
下面的代码用g ++编译,但无法用clang编译.
struct X;
template <typename T>
struct Traits
{
typedef typename Traits<T>::Container Container;
};
template <>
struct Traits<X>
{
typedef std::vector<X *> Container;
};
int main()
{
Traits<X>::Container container;
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
clang错误信息:
main.cpp:9:30: error: no type named 'Container' in 'Traits<T>'
Run Code Online (Sandbox Code Playgroud)
编译器是否应该评估typedef而不用实际类型替换template参数?哪个编译器是对的?
我想做什么:每当要在程序中使用类的实例时运行一些先决条件代码.此代码将检查要求等,并且只应运行一次.
我发现这可以使用另一个对象作为构造函数内的静态变量来实现.这是一个更好的图片示例:
class Prerequisites
{
public:
Prerequisites() {
std::cout << "checking requirements of C, ";
std::cout << "registering C in dictionary, etc." << std::endl;
}
};
class C
{
public:
C() {
static Prerequisites prerequisites;
std::cout << "normal initialization of C object" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
困扰我的是,到目前为止我还没有看到类似的静态变量.是否有任何缺点或副作用或我遗失了什么?或者也许有更好的解决方案?欢迎任何建议.
我想传递任意容器作为函数的参数并迭代它(没有擦除也没有推送元素).不幸的是,似乎没有标准的方法来做到这一点.
我想到的第一个解决方案是一个接口(让我们称之为CollectionInterface),它将由包装STL容器的类实现.所以函数声明看起来像:
f(const CollectionInterface * collection);
Run Code Online (Sandbox Code Playgroud)
或者,我正在考虑方法模板,它具有在编译时保持绑定的优点:
template <class CONTAINER> void f(const CONTAINER & collection);
Run Code Online (Sandbox Code Playgroud)
你认为哪种方式更好?
对于相当简单的操作,实现线程安全的最佳方法是什么?
考虑一对功能:
void setVal(int val)
{
this->_val = val;
}
int getVal() {
return this->_val;
}
Run Code Online (Sandbox Code Playgroud)
因为即使基本类型的赋值也不保证是原子的,我应该以下列方式修改程序中的每个getter和setter是否是线程安全的?
void setVal(int val)
{
this->_mutex.lock();
this->_val = val;
this->_mutex.unlock();
}
int getVal() {
this->_mutex.lock();
int result = this->_val;
this->_mutex.unlock();
return result;
}
Run Code Online (Sandbox Code Playgroud) 我有一份SKU(SKU - Stock Keeping Unit)列表QVariantList.
有没有办法搜索列表并从列表中获取数据?
例如,我想在列表中搜索"sku 0001"并获取SKU的相关标题.
谢谢
在C++中,我经常面临一种情况,当我需要编写const和非const版本的类,类似于const_iterator和标准库中的迭代器.
class const_MyClass
{
public:
const_MyClass(const int * arr):
m_arr(arr)
{
}
int method() const; //does something with m_arr without modifying it
private:
const int * m_arr;
}
class MyClass
{
public:
MyClass(int * arr):
m_arr(arr)
{
}
int method() const; //does something with m_arr without modifying it
void modify(int i); //modify m_arr
private:
int * m_arr;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我需要重复的整个代码const_MyClass中MyClass的API和分发任何变化这两个类.因此,有时我会继承const_MyClass并做一些const_casts,这也不是完美和漂亮的解决方案.仍然当我想const_MyClass通过引用传递实例时,它看起来很蠢:
void func(const const_MyClass & param)
Run Code Online (Sandbox Code Playgroud)
实例参数标有两个"consts",它只有const方法......
这是const构造函数的用武之地,但是有没有现有的替代方案?
有些人用例子来更好地解释问题:
//ok to modify data
void …Run Code Online (Sandbox Code Playgroud) 如果你可以创建另一个if语句,为什么要使用if-else语句?
多个ifs的示例:
input = getInputFromUser()
if input is "Hello"
greet()
if input is "Bye"
sayGoodbye()
if input is "Hey"
sayHi()
Run Code Online (Sandbox Code Playgroud)
使用else-if的示例:
input = getInputFromUser()
if input is "Hello"
greet()
else if input is "Bye"
sayGoodbye()
else if input is "Hey"
sayHi()
Run Code Online (Sandbox Code Playgroud) 我知道,现代编译器不仅可以对内联定义的函数进行过程集成,还可以对驻留在目标文件中的函数进行过程集成.但是当您针对共享库(尤其是dll)编译程序时,这也是正确的吗?粗略地说:将函数代码从dll复制到可执行文件中,如果这是可取的吗?
如标题.它是默认的还是使用我们将不得不添加的C++ 11功能-std=c++11?
现在,由于这个选项,C++ 11仍然感觉像一些额外的,非标准的东西.
要指定编译器,-std=c++11clang,g ++甚至ICC都使用flag.
我认为标题是不言自明的,但更好的格式.
难道sizeof(unsigned char)还保证是1?
我不相信这个问题是重复的,因为:
...It was originally designed as an extension to C, and keeps a similar syntax, but is now a completely different language....char可以是签名或未签名.除非你得到标准的保证,否则没有理由假设sizeof(unsigned char)== sizeof(char)因此问题.c++ ×13
c ×2
constructor ×2
qt ×2
templates ×2
atomic ×1
c++11 ×1
collections ×1
const ×1
containers ×1
declaration ×1
dll ×1
ide ×1
if-statement ×1
inline ×1
locking ×1
mutex ×1
qt-creator ×1
sizeof ×1
stl ×1
typedef ×1