小编Dan*_*tor的帖子

在VS 2013编辑器中显示C++编译错误

我正在使用安装了Productivity Power Tools扩展的Visual Studio 2013.

除了在错误列表中报告之外,我是否可以进行设置以便在编辑器中标记C++编译错误(使用波浪线下划线,滚动条标记等)?

目前,编辑器中仅显示IntelliSense错误.

我试过去"滚动条"选项,并确保选中"显示错误",但这没有任何帮助.

c++ visual-studio visual-studio-2013

6
推荐指数
1
解决办法
701
查看次数

为什么Visual C++会更改我方法的名称?

我有以下代码的问题:

class MainWindow
{
...
private:
bool CreateWindow(std::string, int, int, int, bool);
...
}
Run Code Online (Sandbox Code Playgroud)

bool MainWindow::CreateWindow(std::string title, int width, int height, 
int bits, bool fullscreen)
{
...
Run Code Online (Sandbox Code Playgroud)

Visual Studio突出显示方法定义,并显示以下错误:

int reateWindow(std::string title, int width, int height, int bits, bool fullscreen)
Error: class "MainWindow" has no member called "CreateWindowExW"
Run Code Online (Sandbox Code Playgroud)

并且编译器输出以下内容:

warning C4003: not enough actual parameters for macro 'CreateWindowW'
error C2039: 'CreateWindowExW' : is not a member of 'MainWindow'
Run Code Online (Sandbox Code Playgroud)

我注意到如果我将方法名称更改为其他名称,那么不会以大写字母C开头,错误就会消失.我是Windows开发的新手.是什么赋予了?

c++ windows visual-c++

5
推荐指数
1
解决办法
253
查看次数

静态多态性对实现接口有意义吗?

和大家圣诞快乐!

我正在学习静态多态性,并且正在阅读Andrei Alexandrescu关于基于策略的设计的出色著作。我在代码中遇到了以下内容:我有一个接口Interface,指定Foo必须存在该方法。该接口将由class实现Impl。我有以下两种选择:

1)动态多态

class Interface {
public:
    virtual void Foo() = 0;
}

class Impl : public Interface {
public:
    void Foo() {};
}
Run Code Online (Sandbox Code Playgroud)

2)静态多态

class Impl {
{
public:
    void Foo() {};
}

template <class I>
class Interface : public I
{
public:
    void Foo() { I::Foo(); } //not actually needed
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用静态多态性有意义吗?与第一种方法相比,第二种方法有什么好处吗?该接口仅指定了某些方法的存在,并且其机制对于不同的实现是相同的-因此与书中描述的情况不太一样,因此我觉得我可能只是在使事情变得过于复杂。

更新:我在运行时不需要多态行为;在编译时已知正确的实现。

c++ polymorphism templates policy-based-design static-polymorphism

5
推荐指数
1
解决办法
1402
查看次数

RAII如何应用于需要扩展初始化的类成员?

据我所知,RAII习惯应用于类所需的资源(如果我错了请纠正我),需要资源的类应该定义一个合适类型的成员,并且它的析构函数将被自动调用当使用类实例被销毁时,如下所示:

class Skybox
{
    public:
        Skybox() : tex_(...) {}

    private:
        Texture tex_;
};
Run Code Online (Sandbox Code Playgroud)

除了使用智能指针在堆上分配资源之外,如果资源成员Skybox在资源初始化之前需要在构造函数中执行某些代码,那么如何应用此模式?例如:

class Skybox
{
    public:
        Skybox(const std::string& fileName);

    private:
        Texture tex_;
}

Skybox::Skybox(const std::string& fileName)
{
    // read stuff from skybox initialization file
    // including various texture parameters such as texture file
    ...
    // initialize tex_ based on information read above
}
Run Code Online (Sandbox Code Playgroud)

更新:Texture该类要求在其构造函数中执行所有初始化(即没有Texture::Init()方法可用)

c++ initialization raii

4
推荐指数
1
解决办法
882
查看次数

编写":: namespace :: identifier"和"namespace :: identifier"有什么区别?

我在代码中看到了这两种方法.你能解释两者之间有什么区别吗?我认为它与C++完成名称空间查找的方式有关,你是否可以提供一些关于此的信息,或者可能是一个好的doc的链接?谢谢.

c++ nested namespaces

4
推荐指数
2
解决办法
237
查看次数

抽象跨平台实现的常用习惯是什么?

我是一个旨在跨平台的程序; 因此,它将支持某些操作的多个实现.我的第一个想法是编写一个类的层次结构,具有一个通用接口,可能是每个平台的抽象工厂.

class Operation {
    DoOperation() = 0;
}

class OperationPlatform1 : public Operation {
    DoOperation();
}

class OperationPlatform2 : public Operation {
    DoOperation();
}

#ifdef USING_PLATFORM1
    Operation *op = new OperationPlatform1;
#endif
Run Code Online (Sandbox Code Playgroud)

但是,我意识到将在编译时使用将要使用的实现.我试着想一想如何使用静态多态实现这一点,之后我意识到我也可以按照这些方式写一些东西:

class OperationPlatform1 {
    DoOperation();
}

class OperationPlatform2 {
    DoOperation();
}

#ifdef USING_PLATFORM1
typedef OperationPlatform1 Operation;
#endif

Operation op;
Run Code Online (Sandbox Code Playgroud)

抽象多个实现的好方法是什么,其中只有一个在编译时被选中?我也对性能感兴趣,所以除非必须,否则我不想使用虚拟方法.

c++ abstraction design-patterns idioms

3
推荐指数
1
解决办法
1227
查看次数

参考参数寿命

鉴于以下内容:

class ParamClass {...};

class MyObject {
public:
    void myMethod(ParamClass const& param) { _myPrivate = param; }

private:
    ParamClass _myPrivate;
}

[...]

MyObject obj;

void some_function(void)
{
    ParamClass p(...);
    obj.myMethod(p);
}
Run Code Online (Sandbox Code Playgroud)

在对象p的生命周期结束时_myPrivate会发生什么?编辑:我仍然可以使用_myPrivate访问对象p的副本吗?

谢谢!

c++ object-lifetime

2
推荐指数
1
解决办法
201
查看次数

如何使用私有继承的方法覆盖纯虚方法?

我有以下内容:

class Abstract
{
    virtual void AbstractMethod() = 0;
};

class Implementer
{
    void AbstractMethod() {};
};

class Concrete : public Abstract, private Implementer
{};
Run Code Online (Sandbox Code Playgroud)

我无法实例化,Concrete因为AbstractMethod不会覆盖纯虚方法.我究竟做错了什么?

c++ inheritance multiple-inheritance pure-virtual private-inheritance

2
推荐指数
1
解决办法
154
查看次数

实现树结构最安全的方法是什么?

我想在我的程序中创建一个树结构.现在我有类似于以下内容:

class tree_node
{
    public:
        tree_node (tree_node* parent) : parent_(parent)
        {
            parent_.add_child(this);
        }

    private:
        std::vector<tree_node*> children_;
        tree_node* parent_;
}
Run Code Online (Sandbox Code Playgroud)

我对这个设计的主要关注是tree_node该类可以删除它的任何子节点和父节点.我想改变设计以禁止这种情况.所以:

  • 我可以以某种方式更改设计以使用引用而不是指针吗?(引用的向量不起作用).
  • 如果我使用引用,我如何处理根节点(没有父节点)的特殊情况?
  • 我可以禁止在tree_node课堂上删除孩子/父母吗?

欢迎任何其他实现我的目标的想法.

c++ tree pointers reference

1
推荐指数
2
解决办法
196
查看次数

是否可以限制模板?

可能重复:
C++限制模板功能
是否可以编写C++模板来检查函数是否存在?

是否可以限制可以实例化模板的类型(即,如果我使用,则会出现编译器错误template<type_not_allowed>)?

c++ generics templates

1
推荐指数
1
解决办法
263
查看次数