声明使用C代码的c ++类的多个实例

时间:2011-04-19 00:32:41

标签: c++ c

我有一些C库,我希望能够在c ++类中包装并创建多个完全独立的实例。我试过这样做,但问题是C代码中的变量只是在所有c ++类实例之间共享。

我已经尝试制作静态库并引用它但无济于事。有谁知道怎么做到这一点?

下面的代码示例:我有一个名为CCodeTest的C文件,它只是向内存中的某些变量添加了一些数字。我在MathFuncsLib.cpp中有一个类,它使用它。我希望能够创建MyMathFuncs类的多个实例,并使C代码中的变量独立

CCodeTest.h

#ifndef C_CODE_TEST_H
#define C_CODE_TEST_H

extern int aiExternIntArray[3];

#if defined(__cplusplus)
  extern "C" {
#endif

#define CCODE_COUNT  3

void CCodeTest_AddToIntArray(int iIndex_);
int CCodeTest_GetInternInt(int iIndex_);
int CCodeTest_GetExternInt(int iIndex_);


#if defined(__cplusplus)
   }
#endif
#endif   //defined(C_CODE_TEST_H)

MathFuncsLib.cpp

#include "MathFuncsLib.h"
#include "CCodeTest.h"

using namespace std;

namespace MathFuncs
{
    void MyMathFuncs::Add(int iNum_)
    {
       CCodeTest_AddToIntArray(iNum_);
    }

    void MyMathFuncs::Print(void)
    {
       for(int i = 0; i < CCODE_COUNT; i++)
       {
          printf("Intern Index %i: %i\n", i, CCodeTest_GetInternInt(i));
          printf("Extern Index %i: %i\n", i, CCodeTest_GetExternInt(i));
       }
    }
}

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

您有一个名为aiExternIntArray的全局变量。那就是问题所在。 C ++类的每个实例都在该数组上运行。

您需要做的是创建一个包含int [3]的struct,以便您可以创建此类型的单独实例。

typedef struct
{
    int aiIntArray[3];
} CodeTestStruct;

void CCodeTest_AddToIntArray(CodeTestStruct* ct, int iIndex_);
int CCodeTest_GetInternInt(CodeTestStruct* ct, int iIndex_);
int CCodeTest_GetExternInt(CodeTestStruct* ct, int iIndex_);

在C ++中,您的类应该封装CodeTestStruct

class CodeTestClass
{
public:
    void AddToIntArray(int iIndex_)
    {
        CCodeTest_AddToIntArray(&m_ct, iIndex_);
    }

    int GetInternInt(int iIndex_)
    {
        CCodeTest_GetInternInt(&m_ct, iIndex_);
    }

    int GetExternInt(int iIndex_)
    {
        CCodeTest_GetExternInt(&m_ct, iIndex_);
    }

private:
    CodeTestStruct m_ct;
};

答案 1 :(得分:1)

感谢您的回答 - 上述建议都非常有效。 我的问题是一个不常见的问题,因为我试图运行的C代码将位于资源非常有限的嵌入式系统上,所以我试图最小化指针解除引用和状态管理等...

我在计算机exe中使用此C代码来模拟并行运行此代码的多个微处理器。所以我决定创建两个共享相同C源但接口略有不同的DLL,以便C代码在通过导入DLL加载时将位于单独的内存空间中,并允许我在一次执行中模拟多个微处理器流。

答案 2 :(得分:0)

这就是你永远不应该使用全局变量的原因。这包括像“单身人士”这样的全球变量的委婉说法。此规则有例外,但它们几乎都涉及系统级编程,不适用于应用程序或(非系统级)库。

要解决此问题,请修复C代码,使其对传递给它的参数进行操作,而不是全局变量。

答案 3 :(得分:0)

  • 如果您可以提供自己的库版本,则可以相当简单地重构全局变量。如果库足够大,这可能会使用户烦恼。
  • 与上述类似,您可以使用其他库或编写自己的库。
  • 如果您不想这样做,并且库可以动态链接(即:libfoo.so),您可能可以多次加载库(每个实例一个),尽管这可能意味着在任何严肃的程序中,令人眼花缭乱的记忆可能会慢得令人无法接受
  • 如果你必须使用这个版本的这个库并且它是静态链接的,那么你就差点搞砸了。