0

二重リンク リストを mysh.cpp ファイルに含めて使用できるように、コードを少し変更しようとしています。

mysh.cpp:88: error: no matching function for call to ‘readcommand::initialize(linked_list*)’
readcommand.h:32: note: candidates are: static void readcommand::initialize(readcommand::linked_list*)
mysh.cpp:100: error: no matching function for call to ‘readcommand::add(linked_list*, char*&)’
readcommand.h:34: note: candidates are: static void readcommand::add(readcommand::linked_list*, char*)
mysh.cpp:114: error: no matching function for call to ‘readcommand::traverse(linked_list*, void(char*))’
readcommand.h:38: note: candidates are: static void readcommand::traverse(readcommand::linked_list*, void (*)(char*))

readcommand.cpp ファイルの add(linked_list*, char*) および traverse(linked_list*, void (*callback) (char *)) 関数の同様のエラー (ヘッダーは mysh.cpp に含まれています)


数日前、ヘッダー ファイルを mysh.cpp (前の質問) で動作させるための以前の手順に関連する問題があり、それ以来、構造体定義を readcommand.h ファイルの先頭に移動することで解決しました。今、私はこのエラーに悩まされており、次にどこに行くべきかわかりません。

ファイルの関連部分は次のとおりです。

readcommand.cpp

static void initialize (linked_list *list) {
  list->first = 0;
  list->last = 0;
}

static void add (linked_list *list, char *word) {
  node *nodeX;

  nodeX = talloc();

  if (! nodeX) {
    fprintf (stderr, "allocation failure\n");
    exit (EXIT_FAILURE);
  }

  nodeX->word = word;

  if (list->last) {
    list->last->next = nodeX;
    nodeX->prev = list->last;
    list->last = nodeX;
  }
  else {
    list->first = nodeX;
    list->last = nodeX;
  }
}

readcommand.h

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>

struct node {
  const char *word;
  node *prev;
  node *next;
};

struct linked_list {
  node *first;
  node *last;
};

class readcommand {

  public:

  // Struct Definitions    
  typedef node node_t;
  typedef linked_list linked_list_t;

  // Creation
  static void initialize (linked_list *list);
  node *talloc ();
  static void add (linked_list *list, char *word);

  // Modification and Traversal
  static void del_list (linked_list *list, node *nodeX);
  static void traverse (linked_list *list, void (*callback) (char *));
  static void reverse (linked_list *list, void (*callback) (char *));
  static void traverse_delete (linked_list *list, int (*callback) (char *));
  static void free (linked_list *list);
  static int delete_all (char *word);
  static void print (char *word);

};

mysh.cpp

#include "readcommand.h"

int main (int argc, char** argv) {

  readcommand read;
  linked_list list;
  string input = "";
  read.initialize (& list);

  // Read input string here
  getline (cin, input);
  cout << endl;

  // Parse words individually and add to linked list
  int len = input.length();
  char *str = (char *) input.c_str();
  char *word = strtok (str, " ");

  while (word != NULL) {
    read.add (& list, word);
    word = strtok (NULL, " ");
  }

  read.traverse(& list, read.print);
  printf("\n");

  return (0);
}

「linked_list リスト」を別の方法で初期化する必要がありますか、それとも単に宣言を再配置する必要がありますか?

助けてくれてありがとう。


更新: Stephen Lin が言及した変更により、私が取得しているエラーは次のようになります。

mysh.cpp:88: undefined reference to `readcommand::initialize(linked_list*)'
mysh.cpp:100: undefined reference to `readcommand::add(linked_list*, char*)'
mysh.cpp:114: undefined reference to `readcommand::print(char*)'
mysh.cpp:114: undefined reference to `readcommand::traverse(linked_list*, void (*)(char*))'

更新 2:私の新しいエラー:

mysh.cpp:114: error: no matching function for call to ‘readcommand::traverse(linked_list*, <unresolved overloaded function type>)’
readcommand.h:35: note: candidates are: void readcommand::traverse(linked_list*, void (*)(char*))

mysh.cpp

read.traverse(& list, read.print);

readcommand.cpp

void readcommand::traverse (linked_list *list, void (*callback) (char *)) {
  node *nodeX;

  for (nodeX = list->first; nodeX; nodeX = nodeX->next) {
    callback ((char *) nodeX->word);
  }
}    

void readcommand::print (char *word) {
  printf ("%s, ", (char *) word);
}
4

1 に答える 1

1

次の行を削除します。

// Struct Definitions
struct node;
struct linked_list;

クラスに対してローカルに宣言された新しい型を使用して、これらの構造体のグローバル型定義をシャドウイングしていますreadcommand

また:

typedef struct node node_t;
typedef struct linked_list linked_list_t;

次のように問題ありません:

typedef node node_t;
typedef linked_list linked_list_t;

And は C++ で推奨されますが、前者も機能します。

編集:

また、関数は適切に定義されておらず、メンバー関数ではなくグローバル関数として定義されています。

static void initialize (linked_list *list) {
    // ...
}

する必要があります

static void readcommand::initialize (linked_list *list) {
    // ...
}

他の定義についても同様です。すべての関数がstatic(1 つを除いて) あり、メンバー変数がないように見えるため、実際にreadcommandは名前空間以外にクラスを使用していないことに注意してください。つまり、オブジェクト指向の機能を使用していません。それは受け入れられますが、クラスのオブジェクトをインスタンス化し、その上でドット () 演算子readcommandを使用して静的関数を呼び出しているため、この場合は意図していないようです。これは可能ですが、目的を果たしません。.

あなたはおそらく を使用しないことを意味し、 のメンバー変数staticを作成することを意味しますが、私は 100% 確実ではありません. それ以外の場合は、オブジェクトの作成を完全にスキップして、すべてをなどとして呼び出すことができます。listreadcommandreadcommand::initialize(...)

于 2013-03-02T03:02:16.083 に答える