在我从未听说过智能指针的几个旧代码项目中,每当我需要检查指针是否仍指向有效对象时,我总会做这样的事情......
object * meh = new object;
if(meh)
meh->member;
Run Code Online (Sandbox Code Playgroud)
或者当我需要安全地删除对象时,就像这样
if(meh)
{
delete meh;
meh = 0;
}
Run Code Online (Sandbox Code Playgroud)
那么,现在我已经了解了使用文字数字在布尔表达式中使用对象和指针可能产生的问题,困难的方法:.现在我还了解到C++这个nullptr关键字的新功能还不是很酷的功能.但现在我很好奇.
我已经完成并修改了我的大部分代码,例如,在删除我现在编写的对象时
if(meh)
{
delete meh;
meh = nullptr;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道布尔值.当你将一个int传递给if语句时,
int meh;
if(meh)
Run Code Online (Sandbox Code Playgroud)
然后它隐式检查零,而不需要你编写它.
if(meh == 0) // does the exact same check
Run Code Online (Sandbox Code Playgroud)
现在,C++会为指针做同样的事情吗?如果将这样的char*传递给if语句?
char * meh;
if(meh)
Run Code Online (Sandbox Code Playgroud)
然后它会隐式地将它与nullptr进行比较吗?由于我已经写了这样多长时间这样,所以在这一点上通过输入if(object*)然后调用其成员来检查指针在使用之前是否有效是第二天性.如果这不是功能,为什么不呢?实施起来太难了?通过删除另一个可能搞乱代码的微小方法来解决一些问题.
我想使用 docker 上下文通过 ssh 联系服务器。我的本地有许多不同的 ssh 密钥。如何告诉上下文使用特定的键?我试过了:
docker context create test --docker "host=ssh://<username>@<ip-of-server>,key=C:/path/to/key"
Run Code Online (Sandbox Code Playgroud)
但没有骰子,它总是要求输入密码。有没有办法告诉 docker 上下文使用什么 ssh 密钥?
我试图理解一个概念和一个错误.这有什么问题?
class A
{
public:
A()
{
std::function<void(int)> testFunc(&A::func);
}
private:
void func(int) {}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否可以创建任何类型的对象,该对象能够调用特定实例的成员,其中std :: function的作用类似于成员函数指针,除非没有不能用作函数参数的古怪类型定义继承类.例如:
class A
{
public:
A()
{
index[WM_CREATE] = &A::close;
index[WM_DESTROY] = &A::destroy;
}
protected:
map<UINT msg, void (A::*)(HWND, UINT , WPARAM, LPARAM)> index;
void close(HWND,UINT, WPARAM, LPARAM);
void destroy(HWND, UINT, WPARAM, LPARAM);
};
class B : public A
{
public:
B()
{
index[WM_CREATE] = &B::create; // error because it's not a pointer of type A::*
}
private:
void create(HWND, UINT, WPARAM, LPARAM); …Run Code Online (Sandbox Code Playgroud) 我对图形编程比较陌生,而且我刚读过一些书籍并且一直在扫描教程,所以请原谅我这是否是一个愚蠢的问题.
我已经掌握了directx11的基础知识,现在我想要玩得开心.所以很自然地我一直在深入阅读着色器管道,我已经着迷了.编写一个简单,微不足道的代码片段的想法必须足够有效,每60秒运行数万次而不浪费资源,这让我急于掌握这个概念,然后再继续并可能弄得一团糟东西的.我遇到的问题是掌握像素着色器实际上在做什么.
顶点着色器很容易理解,您可以在一个统一的数据结构中组织一个对象的顶点,这些数据结构与它的信息相关,比如位置和纹理坐标,然后将每个顶点传递到着色器,通过变换矩阵从3d转换为2d .只要我理解它,我就可以找出如何编码它.
但我没有像素着色器.我得到的是顶点着色器的输出是像素着色器的输入.那么只是将像素着色器交给多边形顶点的2d坐标吗?我所了解的是,像素着色器接收单个像素并对其进行计算以确定颜色和光照等事物.但如果那是真的,那么哪个像素呢?整个屏幕还是只是位于变换的2d多边形内的像素?
或者我完全误解了什么?
好的,所以这是我的问题.我的学校使用了一个用于可视化的框架,我一直在尝试将其设置为3D图形.问题是,框架目前只使用固定功能管道来绘制.在没有搞砸的情况下,我一直在尝试解决仍然需要使用固定功能管道的旧代码,并且我一直在设置工具以允许创建着色器和着色器程序.我有一个简单的颜色着色器来编译,我也做了一个测试顶点数组(绿色三角形).
现在当我试图渲染它时,屏幕变黑了.在手之前,有很多2D精灵和什么不在屏幕上移动,但是通过我添加到渲染功能的代码,我发现当我调用glUseProgram时屏幕变黑.如果我注释掉glUseProgram,以及我设置制服和绘画的部分,一切正常.glUseProgram是否禁用固定功能管道?如果是这样的话,无论如何都要重新激活它本身?
我将省略相当多的代码,因为这些是一些相当大的对象,我的问题实际上只涉及std :: make_shared的操作.我在命名空间SYNC中有一个名为D3D11Shader的对象.这有一个名为的静态函数,
SYNC::D3D11Shader * SYNC::D3D11Shader::CreateInstance(const std::string & s)
Run Code Online (Sandbox Code Playgroud)
它将获取一个字符串索引并返回一个指向从SYNC :: D3D11Shader派生的着色器实例的指针.有一次,我开始使用智能指针在包含所有这些着色器的向量中自动重新分配这些指针.但是,当我去做这个,
std::shared_ptr<SYNC::D3D11Shader> shaderPtr;
// ... verification of index and other initialization happens here
// so i am unable to initialize it in it's constructor
shaderPtr = std::make_shared<SYNC::D3D11Shader>(SYNC::D3D11Shader::CreateShader(shaderName));
Run Code Online (Sandbox Code Playgroud)
编译器错误说我试图在这一行中实现D3D11Shader的实例,这是一个抽象类.我以为所有make_shared都返回了一个std :: shared_ptr的实例.CreateInstance函数从不尝试创建此类的实例,只是尝试派生和实现它的对象.在使用此函数和智能指针之前,我没有收到此错误.有谁知道这里发生了什么?
基本的c ++问题我很确定.如果我有一个带有不带参数的构造函数的基类,并且只是初始化一些受保护的成员,派生类是否也会立即调用这个基本构造函数,如果它匹配参数(如意但不太可能),如果没有,则是有一种方法可以强制它从派生类中自动调用所述基础构造函数而不必在派生类中明确告诉它这样做吗?我问,因为我正在编写各种类型的包装,并且有一些受保护的成员,我希望最初初始化为特定值,然后我想根据我的需要派生和操作此基类,但我不喜欢外部用户必须记住显式调用基础构造函数或在自己的构造函数中设置这些值.
当我使用std :: shared_ptr并需要一个自定义删除器时,我通常会创建一个对象的成员函数来促进它的破坏,如下所示:
class Example
{
public:
Destroy();
};
Run Code Online (Sandbox Code Playgroud)
然后当我使用共享ptr时,我只是这样:
std::shared_ptr<Example> ptr(new Example, std::mem_fun(&Example::Destroy));
Run Code Online (Sandbox Code Playgroud)
问题是,现在我正在使用d3d11,我想将com发布函数用作std :: shared_ptr自定义删除器,就像这样
std::shared_ptr<ID3D11Device> ptr(nullptr, std::mem_fun(&ID3D11Device::Release));
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
error C2784: 'std::const_mem_fun1_t<_Result,_Ty,_Arg> std::mem_fun(_Result (__thiscall _Ty::* )(_Arg) const)' : could not deduce template argument for '_Result (__thiscall _Ty::* )(_Arg) const' from 'ULONG (__stdcall IUnknown::* )(void)'
Run Code Online (Sandbox Code Playgroud)
然后当我明确指定模板参数时,如下所示:
std::shared_ptr<ID3D11Device> ptr(nullptr, std::mem_fun<ULONG, ID3D11Device>(&ID3D11Device::Release));
Run Code Online (Sandbox Code Playgroud)
我收到这个错误,
error C2665: 'std::mem_fun' : none of the 2 overloads could convert all the argument types
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么我不能将此功能用作删除器?
注意:不建议我使用CComPtr,我使用的是msvc ++ express版:
我对coffeescript很新.那么这个错误究竟意味着什么呢?
这是班级
class Animation
constructor: (t) ->
@startTime: t
Run Code Online (Sandbox Code Playgroud)
我正在尝试设置它,以便此类在构造期间将成员startTime初始化为t.我做错了吗?
关于这个问题,在一个HashMap中存储一个闭包,我了解到正确地将闭包传递给一个函数需要该函数是通用的,并采用任何实现Fn,FnMut或FnOnce特性的类型.
在从C++实现库的一部分作为学习练习时,我需要一些像这样的类型抽象.
use std::collections::HashMap;
struct Event;
trait IObject {
fn makeFunc<F : FnMut(&Event)>(&mut self, s : &str, f : F);
}
struct Object1<'a> {
m_funcs : HashMap<String, Box<FnMut(&Event) + 'a>>
}
impl <'a> Object1<'a> {
fn new() -> Object1<'a> {
Object1 {m_funcs : HashMap::new()}
}
}
impl <'a> IObject for Object1<'a> {
fn makeFunc<F : FnMut(&Event) + 'a>(&mut self, s: &str, f: F) {
self.m_funcs.insert(String::from_str(s), Box::new(f));
}
}
fn main() {
let obj : &IObject = &Object1::new();
println!("Hello, …Run Code Online (Sandbox Code Playgroud) c++ ×6
c++11 ×1
coffeescript ×1
direct3d11 ×1
directx-11 ×1
docker ×1
opengl ×1
pixel-shader ×1
rust ×1
winapi ×1