我在OpenGL VBO实现中看到了以下宏:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
//...
glNormalPointer(GL_FLOAT, 32, BUFFER_OFFSET(x));
Run Code Online (Sandbox Code Playgroud)
你能提供一下这个宏的工作原理吗?可以用功能替换吗?更确切地说,递增NULL指针的结果是什么?
我刚刚学习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 ++方法".
谢谢您的帮助!担
在阅读文章时,我遇到了以下语法:
template <typename T>
class MyTemplate
{
T* member;
T* method();
// ...
}
class MyClass : public MyTemplate<MyClass>
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
我不完全理解如何MyClass从基于自身的模板继承.你能解释一下这是如何工作的吗?
在类层次结构中的几个类之间共享对象实例的好方法是什么?我有以下情况:
class texture_manager;
class world {
...
std::vector<object> objects_;
skybox skybox_;
}
Run Code Online (Sandbox Code Playgroud)
我目前将texture_manager实现为单例,客户端从代码中的任何位置调用其实例化方法.texture_manager需要object在objects_向量中使用s skybox_,并且可能由其他类使用,这些类可能是也可能不是world类的一部分.由于我试图在我的代码中限制单例的使用,您是否建议使用此方法的替代方法?我想到的一个解决方案是将texture_manager引用作为参数传递给需要访问它的所有类的构造函数.谢谢.
我希望在编译时选择具有多个可能实现的接口.我看到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?
我有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,您是否有任何解决方法/更好的解决方案来解决我的问题?
我正在为我的程序编写一个小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) 鉴于以下内容:
Foo getFoo()
{
Foo result = doSomeWork();
return result;
}
Run Code Online (Sandbox Code Playgroud)
C++是否保证result将被移动而不是复制?换句话说,写作是return std::move(result)多余的?
是否有任何(其他)情况,标准指定在没有显式std::move强制转换的情况下,左值将被静默移动而不是复制?
笔记:
假设Foo是可移动构造的.
无视复制/移动省略,这可能另外适用.
请考虑以下代码:
/*
* myclass.h
*/
class myclass_impl
{
// ...
}
boost::shared_ptr<myclass_impl> myclass;
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式使myclass_impl(或至少直接使用它)对其定义的翻译单元是私有的,允许客户只使用myclasstypedef吗?我想要实现的是如果有人直接使用实现类,编译器会提醒我.
我正在使用安装了Productivity Power Tools扩展的Visual Studio 2013.
除了在错误列表中报告之外,我是否可以进行设置以便在编辑器中标记C++编译错误(使用波浪线下划线,滚动条标记等)?
目前,编辑器中仅显示IntelliSense错误.
我试过去"滚动条"选项,并确保选中"显示错误",但这没有任何帮助.
c++ ×9
pointers ×2
c ×1
crtp ×1
destructor ×1
friend ×1
generics ×1
globals ×1
inheritance ×1
iterator ×1
move ×1
null ×1
opengl ×1
private ×1
shared-ptr ×1
singleton ×1
std-function ×1
templates ×1
typedef ×1
vector ×1
visual-c++ ×1