c++ - 在 D 中使用 C++ 类

标签 c++ class segmentation-fault d

我正试图找到一种在 D 中使用 C++ 类的方法。

http://www.digitalmars.com/d/2.0/cpp_interface.html

D cannot call C++ special member functions, and vice versa. These include constructors, destructors, conversion operators, operator overloading, and allocators.

因此,我试图将这些 C++ 函数简化为 C 风格的函数调用。这是我正在使用的证明。

助手.h

class someClass {
    public:
        someClass();
        char *whatSayYou();
};

extern "C"
{
    someClass *hearMeOut();
}

助手.cpp

#include "helper.h"

someClass::someClass()
{

}

char *someClass::whatSayYou()
{
    return "Everything is gravy";
}


someClass *hearMeOut()
{
    return new someClass;
}

主.d

import std.stdio;

int main(string[] args)
{
    someClass *awesomeExample = hearMeOut();
    char *shoutoutToTheWorld = awesomeExample.whatSayYou();
    writefln(std.string.toString(shoutoutToTheWorld));
    return 0;
}


extern (C++)
{
    interface someClass
    {
        char *whatSayYou();
    }

    someClass *hearMeOut();
}

这是我如何遵守的。

g++-4.3 -c -I code/dg3d_helper -I /usr/local/include/ -o code/dg3d_helper/helper.o code/dg3d_helper/helper.cpp
code/dg3d_helper/helper.cpp: In member function ‘char* someClass::whatSayYou()’:
code/dg3d_helper/helper.cpp:19: warning: deprecated conversion from string constant to ‘char*’
gdc-4.3 -g -c -I code/ -o code/main.o code/main.d
gdc-4.3 -g -I code/ -o main code/dg3d_helper/helper.o code/main.o -lstdc++

一旦调用该方法,我就会遇到段错误。

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402fa0 in _Dmain (args=...) at code/main.d:7
7       char *shoutoutToTheWorld = awesomeExample.whatSayYou();
(gdb) bt
#0  0x0000000000402fa0 in _Dmain (args=...) at code/main.d:7
#1  0x000000000041b1aa in _D9dgccmain211_d_run_mainUiPPaPUAAaZiZi2goMFZv ()
#2  0x000000000041b235 in _d_run_main ()
#3  0x00002aaaab8cfc4d in __libc_start_main () from /lib/libc.so.6
#4  0x0000000000402d59 in _start ()

最佳答案

您的 C++ 版本按值返回。

您的 D 版本希望它通过引用返回。

本质上,您的 C++ 版本将 someClass 的拷贝粘贴在堆栈上。 D 认为 C++ 会在堆栈上放置一个指针。它试图将 someClass 的拷贝解释为指针,但坏事发生了。

问题是在 D 中,类和接口(interface)总是通过引用返回。 C++ 按值返回所有内容,除非您指出它是引用或指针。

因此你需要这个:

someClass * hearMeOut() { return new someClass; }

不要忘记稍后删除它。

关于c++ - 在 D 中使用 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4308345/

相关文章:

c++ - CUDA内存分配性能

python - 类变量的 setter

javascript - JS 对象组合

c - C中的段错误,无法找出原因

c++ - 使用 qsort 导致段错误

c++ - 最短路径算法太慢

c++ - 什么是 diff b/w Includes in VC++ Directories options 和 Additional include directories in C++ -> General in Visual Studio

c++ - 不使用这个的 constexpr 成员函数?

php - 从类内的函数传递变量并在类外回显

c++ - 我是否正确访问了这个 vector 变量?