如何printf()一个用户类?

时间:2014-07-08 05:35:47

标签: c++

编译代码时程序失败。编译器指向printf("Version = '%s'\n", gABXVER)。我想我实际上无法写gABXVER = "V1R1",但我没有其他任何想法。

class CISPFVar_BINSTR : public CISPFVar
{
protected:
    char* m_pBuffer;
    long  m_bDefined;
public:
   ...
    void Initialize(char* szName, long lSize, int bDefineVar = 1)
    {
        Uninitialize();
        ZStrToCharArray(szName, m_cName, 8);
        m_Size = lSize+1;
        m_pBuffer = (char*)malloc(m_Size);
        m_pBuffer[0] = 0;
        if (bDefineVar)
           ISPLINK(__VDEFINE, m_cName, m_pBuffer, __BINSTR, &m_Size);
        m_bDefined = bDefineVar;
    }
      ...    
};

CISPFVar_BINSTR gABXVER;
char szLoadLibraryPath[50];

int main(
    int argc,
    char* argv[])
{
    if (argc > 1)
      if (argv[1]) strcpy(szLoadLibraryPath, argv[1]);

      gABXVER.Initialize("ABXVER",4);

    gABXVER = "V1R1";

    printf("Version = '%s'\n", gABXVER);

    return 0;
};

4 个答案:

答案 0 :(得分:0)

%s系列函数中使用printf时,相应的参数类型必须为const char*或可转换为const char*的内容。您使用的参数不是这种类型。也许你打算使用:

printf("Version = '%s'\n", gABXVER.m_pBuffer);

答案 1 :(得分:0)

编译器应该编译得很好(对printf可能有警告)因为printf并不关心你传递给它的东西(超出第一个参数)或者它是否与格式字符串匹配。现代编译器或错误检查程序如lint将发出警告,如果params显然不匹配,如果你有一个设置"将警告视为错误",编程可能无法编译。

也就是说,CISPFVar_BINSTR需要一个公共拷贝构造函数,如果你想把它作为一个参数传递给一个函数(因为至少在语义上会复制一个副本)。它有吗?正如其他人所说,通过提供您所拥有的任何信息来帮助您的帮助者是习惯做法。在这里,我们严重错过了编译器错误。 (您可以随时编辑您的帖子。)

我可以想象该类转换为char *或std :: string,因此尝试printf("Version = '%s'\n", (char *)gABXVER)printf("Version = '%s'\n", (std::string(gABXVER)).c_str() )就足够了。

答案 2 :(得分:0)

您只能printf具有专门为其设计的格式说明符的内容。没有格式说明符接受类类型的值,因此您不能直接printf

您可以做的最好的事情是将对象明确转换为const char*并将结果传递给printf

答案 3 :(得分:0)

在c ++中,您可以使用许多技术来实现streaming operators

之类的内容
#include <iostream>

class Whatever
{
    int value = 42;

public:
    int Get() const {
        return value;
    }

    friend std::ostream& operator<<(std::ostream&, Whatever const&);
};

std::ostream& operator<<(std::ostream& os, Whatever const& what) {
    os << what.Get();
    return os;
}

int main() {
    Whatever x;
    std::cout << x << std::endl;
}

printf is unsafe

实际上,您将对象serialization转换为可读字符串。