C++的新手,需要帮助解决错误。
下面的代码可以在较早的Sun版本(CC 5.3和5.8)上编译良好。
我在发生错误的行上添加了注释。
任何帮助将不胜感激。
非常感谢。
-RW

Unix版本:SunOS ut51278 5.10 Generic_141444-09 sun4u sparc SUNW,SPARC-Enterprise
编译器版本:CC:Sun C++ 5.11 SunOS_sparc 2010/08/13

database.h:

#include <dbserver.h>
#include <dbstoredproc.h>
#include "dbsql.h"

class Database : public DBServer
{
        public :
                DBSql SQL( const char* sqlCmd );
                DBSql SQL( const std::string& sqlCmd );
                DBSql Table( const char* tableName );
                DBSql Table( const std::string& tableName );
                DBStoredProc storedProc( const char* spName );
                DBStoredProc storedProc( const std::string& tableName );
};

dbsql.h:
 #include <string>
#include "dbaccess.h"
#include "dbtable.h"

class DBSql : public DBAccess
{
public:
        DBSql(DBServer *pServer,const char *sql) ;
        DBSql(DBServer *pServer,const std::string& sql);
        DBSql(DBSql& dbSql);
        DBSql& operator=(DBSql& dbSql);
        virtual DBTable getResultSet();
protected:
        DBSql();
        void init(DBServer *pServer,const std::string& sql);

};

在database.cpp中发生错误...请参见带有错误消息的注释...。

database.cpp:
#include <database.h>
#include "dbsql.h"
using namespace std;

DBSql Database::Table( const char* tableName )
{
     return Table( string( tableName ) );  // Error: "Cannot use DBSql to initialize DBSql."
}
DBSql Database::Table( const string& tableName )
{
      string sqlCmd = "select * from " + tableName;
      return SQL( sqlCmd.c_str() );

}
DBSql Database::SQL( const char* sqlCmd )
{
      return DBSql(this,sqlCmd);
}
DBSql Database::SQL( const string& sqlCmd )
{
      return SQL( sqlCmd.c_str() );
}
DBStoredProc Database::storedProc( const char* spName )
{
     return DBStoredProc( this, spName );
}
DBStoredProc Database::storedProc( const std::string& spName )
{
    return DBStoredProc( this, spName );
}

dbsql.cpp:
#include "dbsql.h"
#include "dbcommon.h"
using namespace std;
using namespace ORACLE;

DBSql::DBSql(DBServer *pServer,const char* sql)
{
   init(pServer,string(sql));
}
DBSql::DBSql(DBServer *pServer,const string& sql)
{
   init(pServer,sql);
}
DBSql::DBSql(DBSql& dbSql)
 : DBAccess(dbSql)
{

}
DBSql& DBSql::operator=(DBSql& dbSql)
{
  DBAccess::assign(dbSql);
  return *this;
}
DBSql::DBSql()
{
}
void DBSql::init(DBServer *pServer,const string& sql)
{
   execSQL(pServer,sql.c_str());
}

DBTable DBSql::getResultSet()
{
DBTable result;
  if(DBAccess::getResultSet(false))
  {
  //In order to prevent DBAccess from closing the previous result set, pass false to
  //getResultSet
    result = DBTable(m_pStmt,m_pResultSet,true); // Pass true to DBTable to allow it
    m_pStmt = NULL;                              //  to control the statement.
  }
  m_pResultSet = NULL;
  return result;
}

最佳答案

更改:

DBSql(DBSql& dbSql);

至:
DBSql(DBSql const & dbSql);

调用Table( string( tableName ) )会产生一个临时文件,需要使用复制构造函数将其复制才能返回。由于该值是临时的,因此您只能获取对其的const引用-而您的复制构造函数不接受该值。

由于您的复制构造函数和赋值运算符实际上不执行任何操作,因此您最好将它们排除在外。如果保留它们,还应该更改DBSql& operator=(DBSql& dbSql);以采用const引用-DBSql& operator=(DBSql const & dbSql);-并在父类副本construcor和赋值运算符中进行相同的更改。

关于c++ - 初始化对象时C++编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5767624/

10-16 21:58