0

here でlibpq-fe説明されているように、SQLサーバーに接続するために使用しています。 このAPIを使用してログインを確認するための小さなファイルを作成しました。

ファイル psql.cpp は次のとおりです。

#include <iostream>
#include <libpq-fe.h>
#include <string>
using namespace std;

void CloseConn(PGconn *conn)
{
  PQfinish(conn);
  getchar();
}

PGconn *ConnectDB(string user="postgres",string password="123321",string dbname="bridge",string hostaddr="127.0.0.1",string port="5432")
{
  PGconn *conn = NULL;
  string s = "user=" + user + " password=" + password + " dbname=" +dbname + " hostaddr=" + hostaddr + " port=" + port;

  // Make a connection to the database
  conn = PQconnectdb(s.c_str());

  // Check to see that the backend connection was successfully made
  if (PQstatus(conn) != CONNECTION_OK)
  {
    cout << "Connection to database failed.\n";
    CloseConn(conn);
  }

  cout << "Connection to database - OK\n";

  return conn;
}


void login_check(PGconn *conn, string username, string password)
{
  string query = "SELECT * FROM login where plid='" + username + "'";

  PGresult *res = PQexec(conn,query.c_str());

  if(PQresultStatus(res) == PGRES_TUPLES_OK)//successful completion of a command returning data
  {
    cout << "query executed successfully\n";
    int row = PQntuples(res); // number of rows in the output of the query
    cout<<row<<endl;
    if (row != 1)
    {
      //wrong username
    }
    else
    {      
      cout<<PQgetvalue(res,0,1)<<endl;
      if( !(string(PQgetvalue(res,0,1)).compare(password)) )//return 0 on equality
      {
        cout<<"valid user";
      }
    }
  }

  // Clear result
  PQclear(res);
}

このファイルにヒットのメイン関数を配置すると、すべて正常に動作します。

int main()
{
  PGconn *conn = NULL;
  //conn = ConnectDB("postgres","123321","bridge","127.0.0.1","5432");
  conn = ConnectDB("postgres","123321","bridge","127.0.0.1","5432");

  if (conn != NULL) {
    login(conn, "11111000", "abcd");
    CloseConn(conn);
  }

  return 0;

}

このファイルを別のファイルに含めたいので、ファイル .cppを作成しました。psql.h

#include <libpq-fe.h>
#include <string>
using namespace std;

PGconn *ConnectDB(string ,string, string, string, string);
void login_check(PGconn, string, string);
void CloseConn(PGconn);

psql.hファイルを使用するために、psql.cppヘッダーで行った変更は次のとおりです。

#include "psql.h"
#include <iostream>

void CloseConn(PGconn *conn)
{
...
...

mainそして、これから関数を削除しました。

新しいファイルに -dispatcher.cppこのファイルを含めたいので、ヘッダーを変更します。

#include "psql.h"

そして、main先に述べた関数の内容mainをこのファイルの関数に入れます。このファイルをコンパイルすると、次のエラーが発生しました。

dispatcher.cpp: In function ‘void login(int)’:
dispatcher.cpp:154:45: error: parameter 1 of ‘void login_check(PGconn, std::string, std::string)’ has incomplete type ‘PGconn {aka pg_conn}’
dispatcher.cpp:155:23: error: parameter 1 of ‘void CloseConn(PGconn)’ has incomplete type ‘PGconn {aka pg_conn}’

私のメイクファイル:

dispatcher:dispatcher.o access.o psql.o
    g++ dispatcher.o access.o psql.o -pthread -I /usr/include/postgresql -lpq -o ./bin/dispatcher

dispatcher.o:dispatcher.cpp
    g++ -I /usr/include/postgresql -lpq -c dispatcher.cpp

access.o:access.cpp access.h
    g++ -c access.cpp

psql.o:psql.cpp psql.h
    g++ -c psql.cpp -I /usr/include/postgresql -lpq

付属品のみで無視access.oして構いません。cを使用してプログラミングしていることは知っていますc++このエラーが発生する理由。それはCPPに固有のものですか?はlogin()から呼び出す単純な関数でdispatcher's mainあり、その定義は上記の と同じmainです。

4

1 に答える 1

3
void login_check(PGconn, string, string);
void CloseConn(PGconn);

これはあなたの機能と一致しません。使用する:

void login_check(PGconn*, string, string);
void CloseConn(PGconn*);

関数の引数には、不完全な型へのポインターを含めることができますが、不完全な型へのポインターを含めることはできません。コンパイラは、呼び出し/スタックを適切に設定するために、オブジェクトのサイズを知る必要があります。不完全な型ではそれを行うことはできませんが、そのような型へのポインタでは可能です。

于 2012-10-27T09:24:56.493 に答える