小编Sim*_*han的帖子

为什么子类不能使用基类保护构造函数创建新对象?

我正在将一些Java代码移植到C#,我遇到了这个用于复制对象的习惯用法:

class Base
{
    int x;
    public Base(int x) { this.x = x; }
    protected Base(Base other) { x = other.x; }
}

class Derived : Base
{
    Base foo;
    public Derived(Derived other)
        : base(other)
    {
        foo = new Base(other.foo); // Error CS1540
    }
}
Run Code Online (Sandbox Code Playgroud)

错误CS1540是:

无法通过类型为"Base"的限定符访问受保护成员'Base.Base(Base)'; 限定符必须是'Derived'类型(或从中派生)

我理解这个错误的目的:它阻止访问兄弟类型的受保护成员.但Base.Base(Base)显然不会在兄弟类型上调用!这根本没有包含在规范中,或者我错过了为什么这不安全的原因?

编辑:嘎,成语new Base(other.foo)不是new Base(other)

c# inheritance constructor protected

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

Visual Studio 11的图形调试器的目标应用程序的要求

当Visual Studio 11宣布"图形调试器"功能时,我感到非常高兴,我立即尝试让它在我所拥有的各种项目上工作,不幸的是我只是设法让它适用于Windows 8 Metro应用程序!具体而言,C++ Metro项目模板可以正确运行并捕获所有预期信息.

使用Visual Studio的Developer Preview版本,在Windows 7上,任何在图形调试器(Alt-F5)下启动应用程序的尝试都会在D3D11CreateDeviceAndSwapChain()上崩溃,即使它们正常工作.在我工作的Windows 8 Consumer Preview机器上的Visual Studio 11 Beta上,我得到了更多,图形调试器HUD正确显示,但任何获取捕获的尝试(应用程序中的打印屏幕或工具栏按钮)只会导致一条消息(在输出日志和打开的.vsglog顶部的黄色栏中):

图形诊断引擎无法提供结果,很可能是因为vsglog使得此计算机上不支持DirectX调用.

直接从Metro模板应用程序移植Direct3D调用就是这种情况!我没有看到来自MSDN文档的任何消息,该功能仅用于Metro,所以我希望我只是做一些愚蠢的事情,但是当不在图形调试器下时应用程序正常工作.

其他信息:D3D11_CREATE_DEVICE_DEBUG设置,DirectX控制面板启用Direct3D调试,我得到预期的创建/销毁信息消息,而输出中没有其他消息.

c++ direct3d visual-studio-2012

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

是否对C++非类型参数(函数)模板进行了排序?

我在当前项目中托管SpiderMonkey,并希望模板函数生成一些简单的属性get/set方法,例如:

template <typename TClassImpl, int32 TClassImpl::*mem>
JSBool JS_DLL_CALLBACK WriteProp(JSContext* cx, JSObject* obj, jsval id, jsval* vp)
{
    if (TClassImpl* pImpl = (TClassImpl*)::JS_GetInstancePrivate(cx, obj, &TClassImpl::s_JsClass, NULL))
        return ::JS_ValueToInt32(cx, *vp, &(pImpl->*mem));
    return JS_FALSE;
}
Run Code Online (Sandbox Code Playgroud)

用过的:

::JSPropertySpec Vec2::s_JsProps[] = {
    {"x", 1, JSPROP_PERMANENT, &JsWrap::ReadProp<Vec2, &Vec2::x>, &JsWrap::WriteProp<Vec2, &Vec2::x>},
    {"y", 2, JSPROP_PERMANENT, &JsWrap::ReadProp<Vec2, &Vec2::y>, &JsWrap::WriteProp<Vec2, &Vec2::y>},
    {0}
};
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加另一个成员类型,这样可以正常工作:

template <typename TClassImpl, JSObject* TClassImpl::*mem>
JSBool JS_DLL_CALLBACK WriteProp(JSContext* cx, JSObject* obj, jsval id, jsval* vp)
{
    if (TClassImpl* pImpl = (TClassImpl*)::JS_GetInstancePrivate(cx, obj, &TClassImpl::s_JsClass, NULL)) …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading

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