0

C++クラスに変換/ラップしようとしているCコードがいくつかあります。私はいくつかのCリテラル配列に遭遇しました(私がそれらを間違って呼んでいる場合は私を修正してください)そして私はあなたがリテラルを行うことができないと思うのでC++コンストラクターでそれらを初期化する方法がわかりません、ランタイム固有のものに。

配列を特定のサイズに明示的に定義し、コンストラクターの配列に対してリテラルのstrcpyなどを実行する必要がありますか?

char sysUpTime[] = {1,3,6,1,2,1,1,3,0};
4

3 に答える 3

3

初期化リストまたは文字列操作の代わりに、次のようなものを使用できます(本当に必要な場合)。

struct Wrapper
{
    template <size_t N>
    Wrapper(const char(&arr)[N]) : vec(arr, arr+N) { }

    vector<char> vec;
};

私の側の慢性的な怠惰のために、私はすべてを公開しました:)。次に、次のように初期化できます。

    char foo[] = { 1, 2, 3, 4, 5 };
    Wrapper bar(foo);

    copy(bar.vec.begin(), bar.vec.end(), ostream_iterator<int>(cout, ", "));
于 2012-12-31T01:44:51.683 に答える
1

std :: stringを使用してOIDを保存しmember initializer list、次に例で初期化することができます。

#include <string>
class Wrapper
{
public:
  Wrapper() : sysUpTime("1.3.6.1.2.1.1.3.0") { }
private:
  std::string sysUpTime;
};

または、C ++ 11 std::arrayを使用します

class Wrapper
{
public:
  Wrapper() : sysUpTime{{1,3,6,1,2,1,1,3,0}} { }

public:
  std::array<char, 10> sysUpTime;
};
于 2012-12-31T01:20:19.193 に答える
1

異なるサイズのcスタイルの配列をコンストラクターに渡すときの主な問題は、サイズを一緒に渡す必要があることです。配列をメンバーベクトルに配置する例を次に示します。

#include <vector>
#include <iostream>

struct Test
{
  std::vector<char> sysUpTime;

  Test(const char sysUpTime[], size_t size) :
    sysUpTime(sysUpTime, sysUpTime + size)
  { }
};


int main()
{
  const char sysUpTime[] = {1,2,3,4,5};

  Test test(sysUpTime, sizeof(sysUpTime) / sizeof(char));
}

残念ながら、動的配列(ベクトル)を使用せずにこれを行う方法はわかりません。テンプレートを使用する以外に、配列のサイズを変更するたびに個別のクラスがインスタンス化されます。

于 2012-12-31T01:47:19.127 に答える