在C#中实现(POCO)struct属性访问器

时间:2012-10-17 21:15:00

标签: c# c++-cli

我想在C#中使用C ++ / CLI dll实现一个接口。但我猜我在C ++中遇到了返回值优化的问题。考虑

// BVHTree.cpp:
public value struct Vector3
{
    float X, Y, Z;
};

public value struct TriangleWithNormal
{
    Vector3 A, B, C, Normal;
};

public interface class IBVHNode
{
    property TriangleWithNormal Triangle { TriangleWithNormal get(); } // among others
    property bool IsLeaf { bool get(); } // can implement this
};

// BVHNode.cs:
public class BVHNode : IBVHNode // Error: member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented (sth. along those lines)
{
    public TriangleWithNormal Triangle { get { return new TriangleWithNormal(); } }
    public bool IsLeaf { get { return true; } }
}

抱怨BVNode没有实施IBVHNode。我的最后一招是通过常规方法或使用像visual studio建议的不安全模式访问它:

public TriangleWithNormal* get_Triangle(TriangleWithNormal* t) 
{ 
    throw new NotImplementedException();
}

有没有办法在属性语法中实现它(除了使TriangleWithNormal成为ref class ...)?

更新1 似乎是出于同样的原因实现方法TriangleWithNormal GetTriangle()失败。但是,您可以像void GetTriangle(TriangleWithNormal%);一样使用它。

2 个答案:

答案 0 :(得分:2)

我修复了一些次要的语法错误(;在C ++ / CLI中的类声明之后,错过了单词bool作为IsLeaf.get()的返回类型) ,并定义了Vector3类型。

我猜到你如何定义Vector3,它不是我熟悉的标准类。它在哪里定义?它是托管类,托管结构还是非托管? (我为我的测试定义为public value struct Vector3 { double x, y, z; };。)

正如我所说,您在此处发布的C ++ / CLI代码中存在轻微的语法错误。这两个错误给出了非常明显的编译错误,所以我假设这些是从Visual Studio到Web的转录中的拼写错误。您发布的内容与实际代码之间是否有任何其他更改?


此外,我无法收到您报告的错误消息member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented。我总是以编译错误error CS0535: 'CSharpTest.BVHNode' does not implement interface member 'CppCLITest.IBVHNode.Triangle'结束。

您显示的属性不带参数,但编译器错误显示的方法get_Triangle采用类型为TriangleWithNormal*的参数。你是否在某个地方有另一个属性声明,或明确声明该方法?


我想我可能有。如果我尝试将C ++ / CLI属性声明为索引属性,那么我会获得类似于您所看到的方法签名。

在您的实际代码中,您是否有类似这样的内容:

property TriangleWithNormal Triangle[TriangleWithNormal] { TriangleWithNormal get(TriangleWithNormal input); }

这是一个索引属性,C#不允许您实现。 (C#允许一个索引属性this[],但只允许一个。)

当我尝试在C#中实现它时,它需要我显式实现属性的支持方法,而不是将其实现为C#属性。

public TriangleWithNormal get_Triangle(TriangleWithNormal input)
{
    return new TriangleWithNormal();
}

使索引属性成为常规属性,这对你来说应该没问题。

答案 1 :(得分:0)

事实证明,在我使用void GetTriangle(TriangleWithNormal%);解决方法生成一些构建周期后,错误消失了。这是一个奇迹或更可能是一个无声的干净构建,在评论错误的属性试图再次重现错误条件,它编译开箱即用。