小编Dan*_*tor的帖子

NULL + int的结果是什么?

我在OpenGL VBO实现中看到了以下宏:

#define BUFFER_OFFSET(i) ((char *)NULL + (i))
//...
glNormalPointer(GL_FLOAT, 32, BUFFER_OFFSET(x));
Run Code Online (Sandbox Code Playgroud)

你能提供一下这个宏的工作原理吗?可以用功能替换吗?更确切地说,递增NULL指针的结果是什么?

c opengl null pointers pointer-arithmetic

19
推荐指数
2
解决办法
5021
查看次数

创建对新对象的引用

我刚刚学习C++,我遇到了以下难题:

作为一个C++新手,我读过使用引用而不是指针(如果可能的话)通常是一个好主意,所以我想尽早养成这个习惯.因此,我有很多具有一般形式的方法

void myMethod(ParamClass const& param);
Run Code Online (Sandbox Code Playgroud)

现在,我想知道调用这些方法的最佳方法是什么.当然,每个调用都需要一个不同的对象作为参数传递,据我所知,创建它的唯一方法是new运算符,所以现在我正在做以下事情:

myObject.myMethod(*new ParamClass(...));
Run Code Online (Sandbox Code Playgroud)

虽然这种方法完全有效,但我想知道是否还没有其他已经建立的"c ++方法".

谢谢您的帮助!担

c++ parameter-passing reference-type

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

一个类如何从基于自身的模板继承?

在阅读文章时,我遇到了以下语法:

template <typename T>
class MyTemplate
{
    T* member;
    T* method();
    // ...
}

class MyClass : public MyTemplate<MyClass>
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我不完全理解如何MyClass从基于自身的模板继承.你能解释一下这是如何工作的吗?

c++ generics templates

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

在类之间共享对象的好方法是什么?

在类层次结构中的几个类之间共享对象实例的好方法是什么?我有以下情况:

class texture_manager;

class world {
    ...
    std::vector<object> objects_;
    skybox skybox_;
}
Run Code Online (Sandbox Code Playgroud)

我目前将texture_manager实现为单例,客户端从代码中的任何位置调用其实例化方法.texture_manager需要objectobjects_向量中使用s skybox_,并且可能由其他类使用,这些类可能是也可能不是world类的一部分.由于我试图在我的代码中限制单例的使用,您是否建议使用此方法的替代方法?我想到的一个解决方案是将texture_manager引用作为参数传递给需要访问它的所有类的构造函数.谢谢.

c++ singleton global-variables globals

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

策略和CRTP的静态多态性有什么区别?

我希望在编译时选择具有多个可能实现的接口.我看到CRTP是实现它的首选成语.这是为什么?另一种选择是策略模式,但我在任何地方都没有提到这种技术:

template <class Impl>
class StrategyInterface
{
public:
    void Interface() { impl.Implementation(); }
    void BrokenInterface() { impl.BrokenImplementation(); }

private:
    Impl impl;
};

class StrategyImplementation
{
public:
    void Implementation() {}
};

template <class Impl>
class CrtpInterface
{
public:
    void Interface() { static_cast<Impl*>(this)->Implementation(); }
    void BrokenInterface() { static_cast<Impl*>(this)->BrokenImplementation(); }
};

class CrtpImplementation : public CrtpInterface<CrtpImplementation>
{
public:
    void Implementation() {}
};

StrategyInterface<StrategyImplementation> str;
CrtpImplementation crtp;
Run Code Online (Sandbox Code Playgroud)

BrokenInterface遗憾的是,在任何一种情况下,编译器都没有捕获它,除非我真的尝试使用它.策略变体对我来说似乎更好,因为它避免了丑陋static_cast,它使用组合而不是继承.还有什么CRTP允许的,那个策略没有?为什么主要使用CRTP?

c++ inheritance design-patterns crtp static-polymorphism

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

如何从shared_ptr调用私有析构函数?

我有resource_manager一个std::vector<boost::shared_ptr<resource> >内部维护的课程.resource_manager是朋友班resource.我希望resources只能被创建/删除resource_manager,所以我将它的构造函数设为私有(可以正常工作).

但是,如果我将析构函数设为私有,则代码不会编译,因为析构函数是由调用的boost::shared_ptr,而不是它的朋友resource.我想只仅返回强制执行"不删客户端"规则const resource*resource_manager,但不知何故,我不满意这个方法提供的安全性(如果一个客户端因为某种跨越一个指向非const发生什么呢?)

除了不使用的明显解决方案之外shared_ptr,您是否有任何解决方法/更好的解决方案来解决我的问题?

c++ pointers destructor friend shared-ptr

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

为什么我得到错误'vector iterators incompatible'?

我正在为我的程序编写一个小UI.我有方法onMouseMotion(),我可以用两种方式之一调用(参见代码); 如果我通过它std::function,那么!=for循环停止条件中的运算符会产生运行时异常vector iterators incompatible.为什么?

class Widget : public EventHandler
{
protected:
    /* ... */
    std::vector<Widget *> children_;                        
    std::function<bool(Event &)> func_;

private:
    bool onMouseMotion(Event &event);
    /* ... */   
};

Widget::Widget() 
{
    /* ... */
    func_ = std::bind(&Widget::onMouseMotion, this, std::placeholders::_1);
    /* ... */
}

bool Widget::processEvent(Event &event)
{
    if (event.getType() == ui::EventType::MouseMotionEvent) {

        /* Method 1 - onMouseMotion works ok */     
        onMouseMotion(event);

        /* Method 2 - onMouseMotion throws */
        //func_(event);

        return true;
    }
} …
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector visual-c++ std-function

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

何时移动左值而不是在C++中复制?

鉴于以下内容:

Foo getFoo()
{
    Foo result = doSomeWork();
    return result;
}
Run Code Online (Sandbox Code Playgroud)
  • C++是否保证result将被移动而不是复制?换句话说,写作是return std::move(result)多余的?

  • 是否有任何(其他)情况,标准指定在没有显式std::move强制转换的情况下,左值将被静默移动而不是复制?

笔记:

  • 假设Foo是可移动构造的.

  • 无视复制/移动省略,这可能另外适用.

c++ move move-semantics

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

一个班级可以私有翻译单位吗?

请考虑以下代码:

/*
 * myclass.h
 */

class myclass_impl
{
    // ...
}

boost::shared_ptr<myclass_impl> myclass;
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式使myclass_impl(或至少直接使用它)对其定义的翻译单元是私有的,允许客户只使用myclasstypedef吗?我想要实现的是如果有人直接使用实现类,编译器会提醒我.

c++ typedef private

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

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

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

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

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

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

c++ visual-studio visual-studio-2013

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