当有问题的类被分成*.h和时,我在实现从一些抽象类继承的纯虚函数时遇到了一些麻烦*.cpp.compiler(g++)告诉我,由于纯函数的存在,派生类无法实例化.
/** interface.h**/
namespace ns
{
class Interface {
public:
virtual void method()=0;
}
}
/** interface.cpp**/
namespace ns
{
//Interface::method()() //not implemented here
}
/** derived.h **/
namespace ns
{
class Derived : public Interface {
//note - see below
}
}
/** derived.cpp **/
namespace ns
{
void Derived::Interface::method() { /*doSomething*/ }
}
/** main.cpp **/
using namespace ns;
int main()
{
Interface* instance = new Derived; //compiler error
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着我必须两次声明 …
如果我没有定义我自己的构造函数,那么Base *b = new Base;vs 之间有什么区别Base *b = new Base();吗?
我经常在代码中遇到POD结构,这些结构是手动零初始化的,memset如下所示:
struct foo;
memset(&foo, 0, sizeof(foo));
Run Code Online (Sandbox Code Playgroud)
我检查了C++ 11标准,它说:"一个对象,其初始化器是一组空的括号,即(),应该进行值初始化." 接下来是: "对T类型的[pod结构]进行值初始化意味着...对象被零初始化."
所以......这是否意味着您可以随时安全地将上述代码压缩为以下代码:
struct foo{};
Run Code Online (Sandbox Code Playgroud)
并且有一个保证初始化的结构,就好像你已经调用了一样memset(&foo, 0, ...)?
如果是这样,那么一般来说,你可以使用空的初始化器安全地初始化任何东西,如下所示:
SomeUnknownType foo{}; // will 'foo' be completely "set" to known values?
Run Code Online (Sandbox Code Playgroud)
我知道在C++ 03中(在统一初始化语法之前)并不总是可行的,但现在C++ 11中是否可以用于任何类型?
我知道,在C++中,当你写作时
int i;
Run Code Online (Sandbox Code Playgroud)
在有效地为其赋值之前,您不能对变量将保持的值做任何假设.但是,如果你写
int i = int();
Run Code Online (Sandbox Code Playgroud)
那么你有保证i会0.所以我的问题是,它实际上并不是语言行为的一种不完整性吗?我的意思是,如果我已经定义了一个类MyClass并且写了
MyClass myInstance;
Run Code Online (Sandbox Code Playgroud)
我可以放心,没有类参数的默认构造函数将被调用以初始化myInstance(如果没有,编译器将失败),因为这就是RAII原理的方式.但是,当涉及到原始类型时,资源获取似乎不再是初始化.这是为什么?
我不认为改变从C继承的这种行为会破坏任何现有的代码(世界上是否有任何代码假设不能对变量的值做出假设?),所以主要可能的原因我想到的就是性能,例如在创建基本类型的大数组时; 但是,我还想知道是否有一些官方解释.
谢谢.
我在初始化指针数组时遇到了麻烦.我发现用gcc c ++(4.6.0)编译的是:
MyClass** a = new MyClass*[100];
Run Code Online (Sandbox Code Playgroud)
并不总是初始化指针数组.(大多数时候它确实给了我一个让我困惑的空指针数组)
MyClass** a = new MyClass*[100]();
Run Code Online (Sandbox Code Playgroud)
DOES将数组中的所有指针初始化为0(空指针).
我写的代码意味着可以在Windows/Linux/Mac/BSD平台上移植.这是gcc c ++编译器的一个特殊功能吗?还是标准的C++?它在标准中的位置是这样说的吗?
我刚刚在cplusplus.com上阅读了新的操作员说明.该页面给出了一个示例,演示了使用new运算符的四种不同方法:
// operator new example
#include <iostream>
#include <new>
using namespace std;
struct myclass {myclass() {cout <<"myclass constructed\n";}};
int main () {
int * p1 = new int;
// same as:
// int * p1 = (int*) operator new (sizeof(int));
int * p2 = new (nothrow) int;
// same as:
// int * p2 = (int*) operator new (sizeof(int),nothrow);
myclass * p3 = (myclass*) operator new (sizeof(myclass));
// (!) not the same as:
// myclass * …Run Code Online (Sandbox Code Playgroud) 似乎在创建一个新的Thrust向量时,默认情况下所有元素都是0 - 我只是想确认这种情况总是如此.
如果是这样,是否还有一种方法绕过负责此行为的构造函数以获得额外的速度(因为对于某些向量,我不需要它们具有初始值,例如,如果它们的原始指针作为输出传递给CUBLAS) ?
我有一个问题.
我在ASIO中开发服务器,数据包是尖头char.
当我创建新的char(例如char * buffer = new char[128];)时,我必须手动将其清理为空值.
通过:
for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}
Run Code Online (Sandbox Code Playgroud)
我做错了,那个字母不清楚?
在使用new时,有一个帖子在类型名称之后处理括号或不处理括号.但是这个怎么样:
如果'Test'是一个普通的类,那么之间有什么区别:
Test* test = new Test();
// and
Test* test = new Test{};
Run Code Online (Sandbox Code Playgroud)
此外,假设Test2有一个类型参数的构造函数Value,它总是等于写:
Value v;
Test2 *test2 = new Test(v);
// and
Test2 *test2 = new Test{v};
Run Code Online (Sandbox Code Playgroud) c++ ×9
constructor ×3
c++11 ×2
new-operator ×2
pointers ×2
abstract ×1
c ×1
char ×1
cuda ×1
gpgpu ×1
inheritance ×1
null ×1
primitive ×1
pure-virtual ×1
raii ×1
thrust ×1