小编Ðаn*_*Ðаn的帖子

当T实现类时,C++/CLI中的IComparable <T>

更新:如评论中所述,C++/CLI应该是value struct; 编译器错误'明确'陈述"必须是值类型".


在C#中,我可以写

      public struct Id<T> : IComparable<Id<T>>
    {
        public int CompareTo(Id<T> other)
        {
            throw new NotImplementedException();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试在C++/CLI中执行相同操作时

generic<typename T>
public ref struct Id : System::IComparable<Id<T>>
{
public:
    virtual int CompareTo(Id<T> other)
    {
        throw gcnew System::NotImplementedException();
    }
};
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误error C3225: generic type argument for 'T' cannot be '...::Id<T>', it must be a value type or a handle to a reference type.

难道仍然是不固定的编译器错误?

.net c# generics c++-cli

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

应该使用unique_ptr更容易实现"移动"语义吗?

编辑:制作FooBar稍微不那么琐碎,直接替换shared_ptr<>更难.


应该unique_ptr<>用作实现移动语义的更简单方法吗?

对于像这样的课程

class Foo
{
    int* m_pInts;
    bool usedNew;
    // other members ...

public:
    Foo(size_t num, bool useNew=true) : usedNew(useNew) {
        if (usedNew)
            m_pInts = new int[num];
        else
            m_pInts = static_cast<int*>(calloc(num, sizeof(int)));
    }
    ~Foo() {
        if (usedNew)
            delete[] m_pInts;
        else
            free(m_pInts);
    }

    // no copy, but move
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
    Foo(Foo&& other) {
        *this = std::move(other);
    }
    Foo& operator=(Foo&& other) {
        m_pInts = other.m_pInts; …
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr move-semantics c++11

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

C#XML反序列化。从节点读取所有内部文本到字符串属性

我目前正在尝试修改类,以使模型上的文本属性包含某个节点(text)节点的所有内部文本。

给我一些问题的xml示例是:

            <component>
                <section>
                    <title>Reason for Visit</title>
                    <text>
                        <content ID="ID3EZZKACA">No Reason for Visit was given.</content>
                    </text>
                </section>
            </component>
Run Code Online (Sandbox Code Playgroud)

我的目标是使模型的text属性具有以下字符串:

"<content ID="ID0EAAKACA">No Reason for Visit was given.</content>"

目前,我的模型如下所示:

public partial class ComponentSection {
    //other model properties here
    private string textField;

    [System.Xml.Serialization.XmlTextAttribute()]
  public string text {
        get {
            return this.textField;
        }
        set {
            this.textField = value;
        }
    }
    //getters/setters for other properties here
}
Run Code Online (Sandbox Code Playgroud)

因此,我目前正在尝试通过使用注释来完成此操作,[System.Xml.Serialization.XmlTextAttribute()]但是当我这样做时,在对XML进行反序列化时,text属性始终通过null来实现。

c# xml deserialization

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

从visual C++调用C#代码

基本上我需要从Visual C++代码调用C#代码.在阅读了很多关于可能方法的文章后,我决定使用C++/CLI机制.

最初我决定在C++本机代码(dll库项目)中有一些函数,它们将调用CLR项目中的一些函数,这些函数将调用C#项目中的一些函数.

在那之后,我想也许我可以摆脱桥梁项目(CLR项目),因为它只是向管理世界过渡.我认为我可以创建我的原生项目,我可以添加一个c ++源文件,我可以只为该文件而不是整个项目启用CLR支持.所以这意味着我的本机项目将只包含一个可以使用C++/CLI语法并代表桥接的文件.所有其他文件只是本机C++源文件.从设计的角度看这是对的吗?!

为了做到这一点,我想我必须将托管C#dll文件添加到C++本机dll文件的其他#using Directories属性中.问题是我不知道如何根据当前配置设置C#dll调试或发布版本的路径.

另外我知道我不能将本机C++ DLL添加到C#项目引用中.但看起来我可以在本机C++项目中添加一个C#dll作为引用.怎么会 ?!这甚至有用吗?如果我可以将C#dll添加到本机C++项目引用中,是否需要设置#using目录?

c# c++ c++-cli

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

实现双向链表,其中数据存储在堆上?

我试图实现一个双向链表,其中节点存储在堆栈上,但堆上的节点数据.您可以使用push()将包含数据的新节点添加到列表中,并使用pop()删除最后一个元素.

我有push()方法的问题.

#include <iostream>

using namespace std;

struct Data {
    string name;
    int age;
};

struct Node {
    struct Node *next;
    struct Node *previous;   
    struct Data *d;         
};

struct Node *first;
struct Node *last;

void init() {
    first = last = NULL;
}


void push(Data d) { 
    Node *temp;

    if(first == NULL){
        first = new Node();
        first->d = malloc(sizeof(struct Data *));
        first->next = NULL;
        first->previous = NULL;
        last = first;
    } else if(last->next == NULL) {
        last->next = new Node(); …
Run Code Online (Sandbox Code Playgroud)

c++ malloc

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

使用MediaCapture直播

对于一个项目,我正在尝试创建一个视频通话应用程序.我正在为通用Windows平台做这个,所以我想我可以使用MediaCapture类.这个类确实有这个StartRecordToCustomSinkAsync()方法,但是为了使用它,我需要创建一个自定义接收器.我开始创建一个,但现在我不得不创建流水槽.此链接解释了Media Sinks,但我找不到关于流接收器的任何文档.

我还研究了Simple Communication,WavSink另一个自定义接收器示例,但代码缺少注释或解决了另一个问题.

有谁知道我如何实施UWP视频通话应用程序,或指出我正确的方向?

PS.我知道这类问题更多,但没有可用的答案:(

c# c++ ms-media-foundation uwp

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

从 C# 动态调用非托管代码

一般来说,我需要能够从我在编译时不知道的任何 DLL 中调用任何非托管函数。

我看到的所有文章(例如https://blogs.msdn.microsoft.com/jonathanswift/2006/10/03/dynamically-calling-an-unmanaged-dll-from-net-c/)都建议使用委托,但我在编译时不知道我要调用哪个函数,甚至不知道它需要哪些参数和多少参数。

基本上我有一个用户输入,如:调用“Kernel32.dll”函数“DeleteFile”参数[“C:\testfile.txt”]。

你能建议至少如何谷歌吗?“动态”这个词没有帮助..

任务本身有点疯狂,因为它实际上是一个大学项目。不确定它在现实生活中是否有用..

var dll = "kernel32.dll";
var fun = "DeleteFile";
var args = new object[] { "C:\\dev\\test.txt" };

IntPtr pDll = NativeMethods.LoadLibrary(dll);

IntPtr pFun = NativeMethods.GetProcAddress(pDll, fun);

// How can I call it in a different way, without having a delegate?
Marshal.GetDelegateForFunctionPointer(pFun, typeof(?????));
Run Code Online (Sandbox Code Playgroud)

c# dll pinvoke unmanaged marshalling

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

从向量中删除元素后的段错误

我目前正在做一个项目,更准确地说是一个七巧板游戏。我有段错误问题,我不明白为什么。

鉴于我有一个完整的项目,我将尝试简化问题:我有一个 GameManager 类,其中特别包含一个 Menu 对象(和其他东西,但我认为这并不重要。gameManager 用于初始化这个对象并管理它。菜单包含一个按钮向量(每个按钮都有一个 lambda 来在用户单击它时执行操作)。

std::vector<std::unique_ptr<Button>> buttons;
Run Code Online (Sandbox Code Playgroud)

为了说明它是如何工作的,我将举一个例子:如果用户点击“加载”按钮,游戏管理器将删除菜单中包含的当前按钮并在该菜单中添加新按钮。

void GameManager::initMainMenuButtons() {
...
menu -> addButton(std::unique_ptr<Button>(new Button(x1, y1, x2, y2, "Create",
    [this]{
        std::cout << "Create level" << std::endl;
        menu->clear()
        initCreateLevelButtons();
        actionManager->setMenu(menu);
    }
)));
...
}
Run Code Online (Sandbox Code Playgroud)

在该代码示例中,我有一个方法 initMainMenuButtons 可以在菜单中添加几个按钮,例如“加载”或“退出”。当用户单击“创建”时,我想更改界面(添加和删除按钮)。所以,要删除按钮,我调用方法 clear()

void Menu::clear() {
  buttons.clear();
  decorationPieces.clear(); // not interesting
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 unique_ptr,因此,我不必手动删除按钮。到目前为止,没问题:按钮的向量似乎是空的(大小为 0)。接下来,调用方法 initCreateLevelButtons()。此方法与 initMainMenu 非常相似:它在菜单中添加按钮,仅此而已。在此调用期间,按钮似乎正确添加到矢量中,我在最后打印了矢量的内容,矢量包含正确的按钮。

在那里,问题出现了:在调用 initCreateLevelButtons() 之后,当我想使用菜单时会出现段错误,因此actionManager->setMenu(menu);不起作用。我尝试打印 menu std::cout << menu << std::endl,并测试此指针是否为 nullptr,但它也不起作用。我不明白为什么菜单在 initCreateLevelButtons() 的最后一行似乎是正确的,然后就无效了。如果我不清除按钮的矢量(菜单->清除指令),程序可以工作,但是,最后一个按钮仍然在这里)。

我尝试使用原始指针,我注意到只要按钮没有被删除,程序就能够清除向量(如果我添加一个循环来删除按钮,就会出现问题),所以,我得出的结论是问题是按钮删除。我不明白为什么,我被卡住了。我不知道我解释得好不好,因为,正如我已经说过的,代码是整个项目的一部分,很难在不引入其他东西的情况下引入类。如果您需要详细信息或方法的完整代码,我可以提供。

c++ smart-pointers vector segmentation-fault raw-pointer

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

使用 gcc 在 cmake 中设置堆栈大小

我正在使用gcc 9.2cmake 3.15在 Linux 上构建 C++ 项目,并且需要增加默认堆栈大小。我之前找到了很多答案,但似乎都不起作用

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,1000000")
message(${CMAKE_CXX_COMPILER_ID})
message(${CMAKE_EXE_LINKER_FLAGS})
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误:

/usr/bin/ld: unrecognized option '--stack'
/usr/bin/ld: use the --help option for usage information
Run Code Online (Sandbox Code Playgroud)

我可以看到参数确实是在 cmake 输出中传递的:

GNU
-Wl,--stack,1000000
Run Code Online (Sandbox Code Playgroud)

而下面这个标志似乎根本不存在。

set(CMAKE_CXX_STACK_SIZE 1000000)
Run Code Online (Sandbox Code Playgroud)

linker gcc g++ cmake

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

CMake 构建类型没有区别

我在 C++ 领域工作了很多年,但对 CMake 还很陌生。

我用构建我的应用程序

cmake --build build_dir --config Debug --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)

这工作正常并构建调试版本。

如果我将 --config 更改为其他内容,例如使用以下命令发布:

cmake --build build_dir --config Release --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)

忍者说“没有工作可做”并退出。运行编译后的应用程序,它显然没有得到优化。此 Cmake 项目中还有两个其他选项,RelWithDebug 和 MinSizeRel,它们的作用相同。

在CmakeLists.txt中有:

set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
Run Code Online (Sandbox Code Playgroud)

还有很多其他提到的各种类型,但目前对我来说都有点希腊语。

我该怎么做才能找出问题出在哪里?

cmake

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