C# 构造函数返回一个对象的问题
 public object Obj_sqlcomm(string sqlcmd)
    {
        sqlconn.Open();
        SqlCommand sqlcommd = new SqlCommand(sqlcmd, sqlconn);
        sqlcommd.ExecuteNonQuery();
        SqlDataReader readsql = sqlcommd.ExecuteReader();
        return readsql;
    }

我最近在做一个小项目,按照我学习软件工程项目管理的模块化思想去做一个小项目,在 object 数据类型的 return 时我遇到一个难题。
上面这段代码这样,我打算让这个构造函数返回一个 SqlDataReader 对象。
但是,我发现,上面的代码好像返回的是 object 对象,而不是 SqlDataReader 对象,如何才能狗让 这个构造函数返回一个 SqlDataReader 呢?

2个回答

直接让方法的返回值为SqlDataReader即可。

public SqlDataReader Obj_sqlcomm(string sqlcmd)
{
sqlconn.Open();
SqlCommand sqlcommd = new SqlCommand(sqlcmd, sqlconn);
sqlcommd.ExecuteNonQuery();
SqlDataReader readsql = sqlcommd.ExecuteReader();
return readsql;
}

    如果是你上面的object的话,其实也可以。

    SqlDataReader sdr = (SqlDataReader)Obj_sqlcomm("xxx");

返回值改为SqlDataReader就好了。。要不你还要自己转换过类型,因为是object,无法直接使用SqlDataReader的方法

  public SqlDataReader Obj_sqlcomm(string sqlcmd)
    {
        sqlconn.Open();
        SqlCommand sqlcommd = new SqlCommand(sqlcmd, sqlconn);
        //sqlcommd.ExecuteNonQuery();
        SqlDataReader readsql = sqlcommd.ExecuteReader();
        return readsql;
    }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++/clr dll工程中,定义一个全局对象,退出dll释放时,atlunadvise返回rpc_e_wrong_thread
环境:c++/clr,引用c# dll 1.一个类CManager,其中定义了一个引用过c# dll的类对象,该对象会调用c#的函数 2.定义一个全局对象CManager g_global,CManager类中创建一个连接点指针 3.CManager的构造函数中,创建了连接点指针atladvise返回值S_OK 4.该dll被一个exe引用,其中函数都正常,现让exe退出 5.在dllmain中,dll detach时,主动调用g_global析构,释放的时候atlunadvise返回rpc_e_wrong_thread, 求大神指点一下,谢谢!
用函数的返回值初始化一个类对象,这其中用了几次复制构造函数
这是我自己写的一段代码 #include<iostream> using namespace std; class Example { int num; public: Example(int i) { num=i; cout<<"This is construction with parameter.\n"; } Example() { num=0; cout<<"This is construction without parameter.\n"; } Example(Example& ex) { cout<<"This is Copy construction.\n"; } ~Example() { cout<<"This is deconstruction.\n"; } Example& operator =(Example& ex) { cout<<"This is assignment function.\n"; this->num=ex.num; return *this; } }; Example fun(Example b) { cout<<"fun().\n"; return b; } int main() { Example b(10); //(1) Example a=fun(b);//(2) cin.get(); } 该函数的输出为(亲测): This is construction without parameter. This is Copy construction. fun(). This is Copy construction. 书上说的也都是这样,但是我有个问题: main中第二步执行时首先调用复制构造函数对应传入的对象b生成一个临时对象(temp),return时再次调用复制构造函数生成一个临时对象用于返回,然后temp析构,按书上说的此刻程序就走完了,但是在main中这一步Example a=fun(b)不应该再用return的那个临时对象来初始化a吗?应该再调用一次复制构造函数才对啊?此处一直想不通,请高手来解答。
委托构造函数的问题C++
#include #include using namespace std; //用来待处理书本销售情况的类 class Sales_data { friend istream &read(istream&,Sales_data&); friend ostream &print(ostream&,Sales_data&); public: //非委托的构造函数使用对应的实参初始化成员 Sales_data(string s,unsigned cnt,double rev): bookNo(s),units_sold(cnt),revenue(rev*cnt){} //其余构造函数全都委托给另一个构造函数 Sales_data():Sales_data(" ",0,0){} Sales_data(string s):Sales_data(s,0,0){} Sales_data (istream &is):sale_data(){ read(is,*this);} string isbn() const{ return bookNo;}//用来返回书本的书名号 Sales_data& combine(const Sales_data&);//如果输入的两个书名号相同,这将这两个书名号 //相同的类的销售数据相加 private: double average() const { return units_sold ? revenue/units_sold:0;}//用来求一本书的平均价格 //因为在不同书店相同书名号的书定价也会不同 string bookNo;//书名号 unsigned units_sold;//销售数量 double revenue;//书本销售的总价 }; //类接口 istream &read(istream&,Sales_data&);//用于从用户读取数据 ostream &print(ostream&,Sales_data&);//用于打印数据 istream &read(istream& is,Sales_data& item) { double price=0; is>>item.bookNo>>item.units_sold>>price; item.revenue=price*item.units_sold; return is; } ostream &print(ostream& os,Sales_data& item) { os<<item.isbn()<<" "<<item.units_sold<<" " <<item.revenue<<" "<<item.average(); return os; } Sales_data& Sales_data::combine(const Sales_data &rhs) { units_sold+=rhs.units_sold;//把rhs的成员加到this对象的成员上 revenue+=rhs.revenue; return *this;//返回调用该函数的对象 } 问题就是出在那三个委托构造函数上,在它们参数列表:后面的被委托的函数名下面编译器老给我画波浪线,说Sales_data不是“Sales_data"类的非静态数据成员 或基类,不过这本书还没讲到基类...............,我照着书本打的 不知道出了什么问题,之前也问过,不过代码没给齐,我自己往后看书以为搞懂了,结果还是不知道问题出在哪
关于C++中对象作为返回值时候的调用复制构造函数
#include <iostream> using namespace std; class A { public: int v; A(int n){v = n;} A(const A &a) { v = a.v; cout << "Copy constructor called" << endl; } }; A Func() { /* A *b = new A(43); return *b; */ A b(54); return b; } int main() { cout << Func().v << endl; return 0; } 注释了的那部分可以成功调用,但是直接定义的一个对象不能调用复制构造函数。这是为什么呢?
return一个类对象的时候 调用了复制构造函数 之后再调用析构函数 为何返回的是析构之后的值?
朋友实现了一个String类 其实问题不少 比如NULL传入strlen等,但是最大的问题是很奇怪 main函数执行到S=S1+S2时 单步调试发现加法运算符重载函数中那个类对象temp在执行到return时 作为参数 传给了复制构造函数 这个正常 按理说之后temp会被析构 然后函数的返回值应当是之前被复制构造函数创建的无名临时对象的值,但很奇怪 调试信息说明 返回的居然是temp被析构之后的值。。。 找了很多的资料也没明白 还望高人指点 ``` #define _CRT_SECURE_NO_WARNINGS #define FILE_BUFFER_LENGTH 30000 #include<iostream> #include<cstring> using namespace std; class CMyString { friend std::ostream& operator<<(std::ostream& out, CMyString& rhs); //friend std::istream& operator>>(std::istream& in, CMyString& rhs); public: CMyString() { buf = NULL; } CMyString(const char* rhs) { buf = new char[strlen(rhs) + 1]; strcpy(buf, rhs); } CMyString(const CMyString& rhs) { buf = new char(strlen(rhs.buf) + 1); buf = rhs.buf; } ~CMyString() { cout << "called" << endl; if (buf != NULL) { delete[]buf; } } CMyString& operator=(const CMyString& rhs); CMyString operator+(const CMyString& rhs); private: char* buf; }; ostream& operator<<(std::ostream& out, CMyString& rhs) { out << rhs.buf; return out; } CMyString& CMyString::operator=(const CMyString& rhs) { if (this != &rhs) { if (buf != NULL) delete[]buf; buf = new char[strlen(rhs.buf) + 1]; strcpy(buf, rhs.buf); } return *this; } CMyString CMyString::operator+(const CMyString & rhs) { CMyString temp; temp.buf = new char[strlen(buf) + strlen(rhs.buf) + 1]; strcpy(temp.buf, buf); strcat(temp.buf, rhs.buf); return temp; } int main() { CMyString S1("Good"), S2(" morning"), S3(" evening"), S; S = S1 + S2; cout << S << endl; //S.~CMyString(); system("pause"); return 0; } ```
C++复制构造函数的疑问
书上说调用复制构造函数有三种情况,但在测试第三种时(如果函数的返回值是类的对象,函数执行完成返回调用者时)发现没有调用复制构造函数,代码如下: #include<iostream> using namespace std; class Point { public: Point(int x=0,int y=0):x(x),y(y){} Point(const Point &p) { cout << "call copy constructor" << endl; x = p.x; y = p.y; } int getX() const { return x; } int getY() const { return y; } private: int x; int y; }; Point fun() { Point a(1,2); return a; } int main(void) { Point a = fun(); cout << a.getX() << endl; return 0; }
Package继承层次(求代码C#)
一些快递商,如FedEx、DHL和UPS,都提供多样化的服务,同时也收取不同的费用。创建一个表示各种不同包裹的继承层次。以包裹类Package作为基类,两日包裹类TwoDayPackage和连夜包裹类OvernightPackage作为派生类。基类Package应该包括含代表寄件人和收件人姓名、地址、所在城市、所在州和邮政编码等的数据成员。此外,还应包含存储包裹重量(以盎司计)和每盎司费用的数据成员。类的构造函数应初始化这些数据成员,并确保重量和每盎司费用为正值。Package应该提供public成员函数calculateCost,该函数计算重量和每盎司费用的乘积,得到的是与运输该包裹有关的费用并返回(返回值类型为double)。派生类TwoDayPackage应继承基类Package的功能,但还应包含一个数据成员,表示付给两日快递服务的平寄费。TwoDayPackage构造函数应接受一个值来初始化这个数据成员。类TwoDayPackage还应该重新定义基类的成员函数calculateCost来计算运输费用,具体方法是将平寄费加上由基类Package的calculateCost函数计算得到的基于重量的费用中。派生类OvernightPackage应直接继承基类,并且应包含一个附加的数据成员,表示付给连夜服务的每盎司的额外费用。类OvernightPackage应当重新定义基类的成员函数calculateCost,来使它在计算运输费用之前,先将额外的每盎司费用加到标准的每盎司费用上。编写测试程序,创建每种Package 的对象并测试成员函数calculateCost。
大神帮看一下代码,为什么t5 = addC(a1, a2)中,只调用了一次copy构造函数?
``` #include<iostream> using namespace std; class ABC { public: ABC(int a = 0, int b = 0) { this->a = a; this->b = b; printf("我是有参构造函数!\n"); } ABC(ABC &c) { this->a = c.a; this->b = c.b; printf("我是copy构造函数!\n"); } //成员函数 ABC addC(ABC &c) { //1.实例化t1 //2.实例化匿名对象 //3.t1调用构造函数给匿名对象赋值 //4.ti被析构 ABC t1(this->a + c.a, this->b + c.b); return t1; } ABC& addC2(ABC &c)//返回一个引用,相当于自身 { this->a = this->a + c.a; this->b = this->b + c.b; return *this; //把*(&调用者)回到了调用者元素 } //成员函数 void PrintABC() { printf("t2->a:%d,t2->b:%d\n", this->a, this->b); } ~ABC() { printf("我是析构函数!\n"); } public: int a; int b; }; //全局函数 //成员函数 转为全局函数 多了一个参数 void PrintABC(ABC *t2) { printf("t2->a:%d,t2->b:%d\n", t2->a, t2->b); } //全局函数 //全局函数转成 成员函数 少了一个参数 ABC addC(ABC &c, ABC &d) { //1.实例化temp //2.实例化匿名对象 //3.temp调用构造函数给匿名对象赋值 //4.temp被析构 ABC temp(c.a + d.a, c.b + d.b); return temp; } void main() { ABC a1(1, 2); ABC a2(3, 4); ABC a3; //全局函数方法 a3 = addC(a1, a2); //成员函数方法 { ABC a4 = a1.addC(a2); //匿名对象直接转化为 t4(直接转化,不调用copy构造函数) a4.PrintABC(); ABC t5; printf("=====================\n"); t5 = addC(a1, a2);//匿名对象赋值给t5 t5.PrintABC(); } system("pause"); } ```
这样会调用拷贝构造函数吗?输出结果是什么?调用顺序什么?求解
#include<iostream> using namespace std; class Person { public: Person() { cout << "无参构造函数!" << endl; } Person(int age) { mAge = age; cout << "有参构造函数!" << endl; } Person(const Person &p) { mAge = p.mAge; cout << "拷贝构造函数!" << endl; } //析构函数在释放内存之前调用 ~Person() { cout << "析构函数!" << endl; } public: int mAge; }; //以值方式返回局部对象 Person doWork2() { Person p1; return p1; } void test03() { Person p=doWork2(); } int main() { test03(); return 0; }
c++对象数组 构造函数
题目是一个打印工资单(payrate*hours),数组里有七个对象,需要每个对象的输入时间(hour)乘payRate,最后返回到payTotal里,可是不知道怎么把键盘输入的存入对象数组里,而且总是报错,而且后面函数里的变量好像也有点问题,没用到数组,不知道怎么改啊,急求解答!!!!!非常感谢!! 这是main函数的cpp ``` #include <iostream> #include <iomanip> #include "Payroll.h" using namespace std; int main() { const int NUM_EMP = 7; double value; int num; Payroll employee[NUM_EMP]; cout << "Enter the payRate for the employee: "; cin >> num; for(int i=0;i<NUM_EMP;i++) { cout << "Employee" << i+1 << " : " << "Enter the numbers of hours: "; cin >> employee[i]; } Payroll item(); cout << setprecision(2) << fixed; for(int k=0;k<NUM_EMP;k++) { cout << "The amount of gross pay for employee" << k+1 << ": " << employee[k].getTotalPay << endl; } return 0; } ``` 下面是Payroll.cpp ``` #include "Payroll.h" // Needed for the Rectangle class #include <iostream> // Needed for cout #include <cstdlib> // Needed for the exit function using namespace std; Payroll::Payroll() { hours = 0.0; payRate = 0.0; } void Payroll::setHours(double hou) { if(hou <= 60.00) hours = hou; else { cout << "Please Enter the valid numbers: "; exit(EXIT_FAILURE); } } void Payroll::setPayRate(double pay) { payRate = pay; } ``` 最后是payroll.h ``` #ifndef PAYROLL_H #define PAYROLL_H class Payroll { private: double hours; double payRate; public: Payroll(); void setHours(double); void setPayRate(double); double getHours() const { return hours; } double getPayRate() const { return payRate; } double getTotalPay() const { return hours * payRate; } }; #endif ```
关于返回一个无名临时对象的问题?C++
以下有两个类,分别为Complex和Point。 Complex重载了+运算符,并返回一个临时无名对象; Point重载了后置++运算符,为什么却不能像Complex那样返回一个临时无名对象呢? 【详细见以下代码注释行】 #include <iostream> using namespace std; class Complex { public: Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {} friend Complex operator+(const Complex &c1, const Complex &c2); friend Complex operator-(const Complex &c1, const Complex &c2); friend ostream &operator<<(ostream &out, const Complex &c); private: double real; double imag; }; Complex operator+(const Complex &c1, const Complex &c2) { return Complex(c1.real + c2.real, c1.imag + c2.imag); //为什么这里可以返回一个临时的无名对象? } Complex operator-(const Complex &c1, const Complex &c2) { return Complex(c1.real - c2.real, c1.imag - c2.imag); } ostream &operator<<(ostream &out, const Complex &c) { cout << "(" << c.real << "," << c.imag << ")"; return out; } #include <iostream> #include <cmath> using namespace std; //Point类定义 class Point { public: Point(int xx = 0, int yy = 0) { x = xx; y = yy; } Point(Point &p); int getX() { cout << x << endl; return x; } int getY() { cout << y << endl; return y; } friend Point operator++(Point &p,int); private: int x, y; }; Point::Point(Point &p) { x = p.x; y = p.y; cout << "调用Point类的复制构造函数" << endl; } Point operator++(Point &p,int) { Point old; old.x = p.x; old.y = p.y; p.x++; p.y++; return old; //return Point(p.x++, p.y++);为什么这里不能返回一个临时无名对象?并且报错类Point没有适当的复制构造函数? }
C++:test类中为什么创建了6个对象,却调用了7次析构函数
自己写了个Test类,原来是想验证在在下面这条语句中是不是先创建一个临时变量,然后再调用拷贝构造函数, ``` Test t3 = test_func(t2); ``` 程序共3个文件test.h test.cpp 和prac.cpp,分列如下: ``` // test.h class Test { public: Test(); ~Test(); Test(const Test &); const Test operator=(const Test &); friend Test test_func(const Test ); void say(void); }; ``` ``` // test.cpp #include <iostream> #include "test.h" Test::Test() { std::cout << "default constructor called!\n"; } Test::~Test() { std::cout << "default destructor called!\n"; } Test::Test(const Test &) { std::cout << "Using copy constructor...\n"; } const Test Test::operator=(const Test& test) { std::cout << "Using default assignment overloaded\n"; } Test test_func(const Test test) { std::cout << "------------------------------\n"; Test tst; std::cout << "------------------------------\n"; return tst; } void Test::say(void) { std::cout << "I'm here!\n"; } ``` ``` // prac.cpp #include "test.h" int main(void) { Test t1; Test t2; t1 = test_func(t2); Test t3 = test_func(t2); t3.say(); return 0; } ``` 运行之后,出现了下面的情况 ``` default constructor called! // t1 default constructor called! // t2 Using copy constructor... // 第一次调用test_func函数参数传值 ------------------------------ default constructor called! // 第一次调用test_func函数中的局部变量 ------------------------------ Using default assignment overloaded // 使用test_func函数返回值给t1赋值 default destructor called! // 第一次调用test_func函数参数释放 default destructor called! // 第一次调用test_func函数局部变量释放 **default destructor called! ** // 这里的这个是哪个对象调用的呢? Using copy constructor... // 第二次调用test_func函数参数传值 ------------------------------ default constructor called!// 第二次调用test_func函数中的局部变量 ------------------------------ default destructor called! // 第二次调用test_func函数中参数释放 _// 这里不是该有一个第二个局部变量释放调用default desctructor 的语句打印吗吗? // 这里不是该有一个t3 使用复制构造函数的语句打印吗?_ I'm here! // t3 调用say() default destructor called! // t3 释放 default destructor called! // t2 释放 default destructor called! // t1 释放 ``` 现在弄不明白的是那多出的一个析构函数调用是哪里用到的? 还有在t3声明初始化为函数返回值时,用没用临时变量传值(从程序输出看,好像第二次局部变量再函数运行完之后没有释放,而是直接变身成了t3)?
程序运行后txt文本出现乱
程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答 请问这种情况该如何解决 ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134842_865518.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134945_774123.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576135365_278865.png) ``` #include<iostream> #include<string.h> #include<iomanip> #include<fstream> #include<stdio.h> #include <stdlib.h> using namespace std; int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} //打印一个节点的数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { pHead=pnode; pnode->pNext=0; return; } else //否则,插入到链表首部 { pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } if (p1==pHead) //如果要删除的是首结点 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库价格 unsigned int szNumber; char szPrice[20]; char szN; CList ShList; public: Repository(); //构造函数 Repository(char *name,int number,char *price); void SetRecord(char *name, int number,char *price); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,"\0"); szNumber=0; strcpy(szPrice,"\0"); } Repository::Repository(char *name,int number,char *price) { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *price) //输入数据函数 { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; return strcmp(szName,temp.szName); } void Repository::Show() //打印一个结点的数据 { cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl; } void Repository::AddRecord() //将记录添加到链表中 { CNode *pNode; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入新商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { cout<<"请输入新商品入库价格: "; cin>>szPrice; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szPrice); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<"请输入新商品名(输入0退出,并进入系统菜单) "; cin>>szName; } cout<<endl<<endl; } void Repository::Display() //显示全部链表数据 { cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n"; cout<<"目前库存共有商品信息记录是:\n\n"; cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl; ShList.ShowList(); cout<<endl<<endl; system("pause"); system("cls"); } void Repository::LookUpRecord() // 按照商品名查找 { CNode *pLook; char szName[20]; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while (strcmp(szName,"0")) { Repository sh(szName,0,"0"); //生成结点 pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { ShList.DeleteNode(pLook); cout<<szName<<"的信息记录删除成功!"<<endl; delete pLook; count--; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录删除失败!"<<endl; } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::ModifyRecord() //修改商品记录 { CNode *pLook; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: "; cin>>szName; cout<<"请输入修改后的商品数量:"; cin>>szNumber; cout<<"请输入修改后的商品入库价格: "; cin>>szPrice; cout<<"请确定是否修改此记录(Yes (Y) or No(N)):"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { pSh=new Repository; pSh->SetRecord(szName,szNumber,szPrice); pLook->InputData(pSh); cout<<szName<<"的信息记录修改成功!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录修改失败!"<<endl; } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { pSh=(Repository *)pLook->GetData(); cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); if (0==pSh->szNumber) { cout<<"该商品缺货,请及时补充!"<<endl; } else { cout<<"请输入您要取出的商品数量:"; cin>>szNumber; cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { if(pSh->szNumber<=szNumber) { cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl; pSh->szNumber=0; } else { pSh->szNumber-=szNumber; cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl; } cout<<szName<<"成功取出!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"您取消了该操作"<<endl; } } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::SaveToFile() //将链表中的数据保存在文件中 { ofstream outfile("repository.txt",ios::binary); if(! outfile) { cout<<"数据文件打开错误,没有将数据存入文件!\n"; return; } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 } outfile.close(); } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile("repository.txt",ios::binary); if(! infile) { cout<<"没有数据文件,请您先添加!\n\n"; return; } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 } ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); } void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { if (strChoice=="1") AddRecord(); else if (strChoice=="2") Display(); else if (strChoice=="3") LookUpRecord(); else if (strChoice=="4") DeleteRecord(); else if(strChoice=="5") ModifyRecord(); else if(strChoice=="6") Output(); else if (strChoice=="0") SaveToFile(); else cout<<"对不起,您的输入有误,请重新输入您的选择: "; } int main() { Repository repository; cout<<"*******************************************************************\n\n"; cout<<" 欢迎进入库存管理系统 \n\n"; cout<<"*******************************************************************\n\n"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<"【欢迎进入系统菜单】:\n\n\n"; cout<<" <1>.添加新商品信息记录\n\n"; cout<<" <2>.显示库存中商品信息记录内容\n\n"; cout<<" <3>.根据商品名查询库存中商品信息记录\n\n"; cout<<" <4>.根据商品名删除库存中商品信息记录\n\n"; cout<<" <5>.根据商品名修改库存中商品信息记录\n\n"; cout<<" <6>.商品出库\n\n"; cout<<" <0>.退出系统\n\n\n"; cout<<"【请输入您的选择】:"; cin>>strChoice; system("cls"); repository.Operate(strChoice); }while(strChoice!="0"); cout<<"***********************************************************************\n\n"; cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n"; cout<<"***********************************************************************\n\n"; system("pause"); } ```
C++作业派生类的定义求解
如下,现已有一个完整的长方形的类Rectangle, 数据成员有长和宽,成员函数包括一个构造函数和一个计算面积的函数area()。 请写出一个表示长方体的派生类Box,继承这个已给出的Rectangle类,满足以下要求: (1)* 只能新增一个数据成员:height (高)。 (2)* 定义一个合适的Box类构造函数,使得main函数中创建对象的初始化可行; (3)* 使用合适的继承方式,使得main函数中能通过派生类Box对象直接调用基类中的area()函数输出底面积。 (4) 新增一个成员函数 volume() 返回长方体的体积,使得main函数中的调用可行; #include<iostream> using namespace std; class Rectangle //长方形 { public: Rectangle(double l, double w) : length(l), width(w) { } double area() { return length * width; } private: double length; //长 double width; //宽 }; //在此定义派生类Box // 在此处补充你的代码 int main() { Box b1(10, 20, 30); cout << b1.area() << endl; cout << b1.volume() << endl; return 0; } 输入 无 输出 main函数输出的两行,第一行应该是b1的底面积,第二行输出的是b1的体积 样例输入 无 样例输出 200 6000
跪求大神帮帮忙,都好说。。。
实验目的: 1. 掌握常用控件的属性、方法、事件 2. 掌握窗体的常用属性、方法和事件 3. 掌握Windows应用程序人机界面可视化设计方法 4. 掌握事件驱动模型的思想 5. 巩固C#语言中类的定义、继承、流程控制语句等基础知识 实验步骤: (1) 在.Net环境中建立Windows窗体应用程序; (2) 定义枚举类型 Public enum SexType {男, 女, 未知}; Public enum ProTitle (助教,讲师,副教授、教授、未知) Public enum StuTitle {班长,副班长,学委,学员} (3) 定义下面类  Person类(抽象类) 包含的字段:姓名Name(字符串型)、身高Height(单精度型,单位:米)、体重Weight(单精度,单位:kg)、性别Sex(枚举类型SexType) 包含的属性:身份证号ID(字符串型,长度固定为18,且不包含空格字符)、年龄Age(只读方法) 包含的方法: Public abstract void Saying(); //该方法为抽象方法 构造函数(带参数和不带参数的各定义一个): Public Person(){}; //在该构造函数对字段进行初始化,按默认值进行初始化,其中身份证号码初始化为“999999999999999999” Public person(string name, string id, float height, float weight, SexType sex) {}; //添加代码,利用实例化时传递的参数对类中的字段进行初始化 Public abstract void Write(FileStream fs); //功能:将数据保存到文件中 Public abstract void Read(FileStream fs); //功能:从文件中读取数据  Teacher类,该类从Person类继承 包含的字段:职称Title(ProTitle枚举类型)、课程Courses(集合类型,集合元素类型为字符串,访问控制符为private) 包含的属性:CourseNumber (数据类型:int,只读属性,含义:课程的数量) 包含的方法: Public string CourseAdd(string coursename) //增加一门课程,同一门课程不能重复添加 Public string CourseDelete(string coursename); //删除一门课程,当要删除的课程不存在时,应给出提示 对父类中的抽象函数Saying()进行重写;//在控制台上输出:“我正在讲课,不方便接电话” 对Object类中的虚函数ToString()进行重写;//将有关教师的所有信息整合成一个字符串,并返回。该虚函数在Object中的定义如下: Public virtual string ToString() 对父类的中Read()、Write()方法进行重写。(方法中的代码可暂时不写)  定义结构体 Public struct coursescore { String coursename; //课程的名称 Float score; //课程的成绩 }  定义学生类Student,从Person类派生 包含的字段:学号StuID(字符串类型,长度固定,以实际学号的长度为准)、课程成绩CourseScore(集合类型,集合中的元素类型为结构体coursescore,访问修饰符采用private)、学生身份title(类型为枚举类型StuTitle) 包含的属性: 课程门数CourseNumber,定义为只读属性,表示学生所选的课程门数 包含的方法: Public void CourseAdd(string coursename, float score); Public void CourseAdd(coursescore course); 上述2个方法为重载,功能是实现增加一门课程及该课程的成绩 对父类的中的Saying()进行重写,要求输出“我正在上课,不方便接电话” 对父类的中的Read、Write方法进行重写(方法体中可暂时不写代码) 增加如下方法: //功能:获取学生的所有课程的最高分、最低分和平均分 Public void GetScore(ref double HighScore, ref double LowScore, ref double AverageScore) 参数的含义: HighScore:所有课程中的最高分 LowScore:所有课程中的最低分 AverageScore:所有课程的平均分 对Object类中的虚函数ToString()进行重写,要求该方法将学生的所有信息整合为一个字符串,并返回  Document类 字段: Private List<string> CourseList; //存储课程列表 Private List<Person> PersonList; //存储学生和教师信息的列表 方法: Public Document(); //构造函数 Public void AddCourse(string CourseName) ;//增加课程 Pulic void DeleteCourse(string CourseName); //删除课程 Public void AddPerson(person personobj); //增加学生或教师 Public void DeletePerson(person persin); //删除学生或教师对象 Public void DeletePerson(string ID); //按照身份证号码删除教师或学生 Public person FindPerson(string ID); //按照身份证号码查找教师或学生对象 Public void SaveData(FileStream fs); //将数据保存到文件中 Public void ReadData(FileStream fs); //从文件中读取数据 属性: Public int TeacherNumber; Public int StudentNumber; 事件: Public event NumberChangingEventHandler onPersonNumberChanging;  委托 Public delegate void NumberChangingEventHandler(object sender, EventNumberArgs e);  EventNumberArgs类(用户传递事件参数) 字段: Public int teacherNumber; Public int studentNumber;
如何卸载assembly?或者class
.net的动态编译功能很好,但是有个问题,动态编译的代码,每次执行后,都会产生一个新的assembly,而且无法卸载。这个动态方法执行多次之后,就会慢慢的内存泄漏。因为每个assembly都会占用内存。 google了一下,没有发现满意的答案。唯一的答案就是,把assembly放到一个appdomain里,然后所在的appdomain卸载掉。但如果这样的话,所有的东西都得通过rpc调用了,效率非常低。 从原理上来说,已经加载的class,应该是可以卸载的。不知道是否有办法调用原生的api去卸载一个已经加载的assembly。 [b]问题补充:[/b] 我的问题是,需要实现一个脚本操作的功能,对已有的数据进行处理,并且用到linq查询,然后返回查询的结果。 查询的逻辑是未知的,由客户输入脚本来实现。查询的结果是一个二维表。但是希望查询结果返回的数据结构是自描述的。为了简化问题,就用了linq的匿名对象。 现在的做法,是用动态编译的方法,用CSharpCodeProvider动态编译客户输入的那段代码,产生一个CompilerResult,这个地方的问题的实质,是需要一个编译器。现在为了省事,就调用了c#的编译器,但是后果就是每次执行一个脚本,就会生成一个Assembly。长期执行下去,内存会慢慢变少。因此希望能将这个Assembley卸载。 Expresstion Tree比较麻烦,因为问题就是要做语法分析,如果已经成了Tree就不需要做了。 感谢RednaxelaFX兄的解答,我想xie卸载程序集还是有可能的。理由是:第一,有些.net代码保护工具,就可以让clr把已经加载的类卸载,防止别人dump整个程序集。第二,Dlr的类是动态生成的。如果无法卸载动态生成的类,等着它的必定是内存泄漏。 从编程语言的发展趋势看,总的趋势是越来越灵活。开始阶段,是针对硬件的汇编,然后是对硬件的具体实现有一定抽象作用的c语言,再到有oo特性的c++,然后是继承了GC和更过oo特性的java和c#。现在的趋势是,对编程语言本身进行编程,表现就是Aop和动态语言。 动态语言,它需要的除了动态编译以为,就是对把gc的特性扩展到类的类型本身。当一个类的代码不再被需要,它也可以被GC。我以为,动态的创建和销毁代码,也是非常必要的。它实际上是未来编程语言的一个方向。 [b]问题补充:[/b] 再次感谢RednaxelaFX兄的热情解答。使我明白DLR是怎么实现的。 ironpython是个好主意。可惜我要的不仅仅是脚本,还需要linq的查询结果。如果用ironPython的话,它返回给我的是个动态类型,虽然可以动态增加删除成员,奈何我还要对返回的数据进行处理。如果不是.net的数据控件支持的类型,我还得开发一堆数据控件或者adapter去支持它的类型,比较麻烦,我还没做好成为ironpython的开发人员的心理准备。最理想的办法,就是能卸载assembly。这样工作量就是最小的。其实,不卸载也是无所谓的,因为我可以把写好的脚本缓存起来,不必每次都生成新的assembly。客户也不会无聊到写很多脚本故意把它搞崩溃。 之所以研究这个问题,纯属心理上的洁癖,想让它有个更好的解决方案。 关于.net保护工具如何让已经加载的类重新被卸载的问题,我也不知道答案,作者也没有公布。因为这可能就是他保护技术的核心。我想,如果有办法能让程序回到一个程序集加载之前的状态,就算是完成了卸载操作。如果确信程序集不再被引用,那么应该有办法完成这个操作。不过,这一定需要非常了解clr的底层结构。 .net没有提供加载的类卸载的方法,只是出于安全性的理由,这个类可能被别的代码引用,卸载了它,就可能会出现野指针。 此外,如果类可以卸载,那么有些静态构造函数的语义,可能会被改变。因为重新加载类的时候,静态构造函数可能会再次执行。 如果类也增加引用计数之类的机制,那么,类本身也应该是可以被gc的。 既然代码可以动态的创建,那为什么不可以动态的删除?既然对对象的GC可以做到,那么对类型的GC,一样可以做到。这不过是编程语言设计者观念上的问题,不是不可逾越的障碍。 静态编译,不过是为了提高运行效率而已。如果效率可以接受,那静态编译对于编程思想的表达,并不是必须的。 也就是说,动态的产生类,动态的销毁类,完全是可行的。类也不过是数据而已。
rror C2084: 函数“Student::~Student(void)”已有主体 1> : 参见“{dtor}”的前一个定义
# 报错说已有主体。但我检查没有啊跪求大佬解惑(一个c++学生信息系统) ``` #include<string.h> using namespace std; #define SIZE 80 //宏定义语句!!不要加; class Student { private: char*name; //姓名 char ID[19]; //身份证 char number[10]; ///学号 char speciality[20];//专业 int age; //年龄 public: Student(); Student(char*n,char *id,char *nm,char *spe,int a);//有参构造//定义为静态数组,参数仍为字符指针,获取函也为指针 Student(const Student&pre); ~Student(); void intput(); void output(); char* getname(); char* getID(); char* getnumber(); char* getspec(); int getage(); }; #endif ``` ``` #include"identify student.h" //ps:".h"文件的实现的cpp文件需要和.h文件同名为约定俗成:(cpp文件中包含了.h就会被编译器识别) Student::Student () {} //无参构造函数 Student::Student(char*n,char *id,char *nm,char *spe,int a) //有参构造函数 { if(n) { name=new char[strlen(n)+1]; strcpy(name,n); } id=ID; nm=number; spe=speciality ; a=age; } Student::~Student () { if(name) delete[]name; } Student::Student(const Student&pre) //拷贝构造函数 { if(pre.name) { delete[]name; name=new char[strlen(pre.name)+1]; strcpy(name,pre.name); } else name=0; strcpy(ID,pre.ID); strcpy(number,pre.number); strcpy(speciality ,pre.speciality ); age=pre.age; } void Student::output() { cout<<"姓名"<<age<<endl; cout<<"年龄"<<age<<endl; cout<<"身份证号码"<<ID<<endl; cout<<"专业"<<speciality <<endl; cout<<"学号"<<number<<endl; } void Student ::intput() { char n[10]; cout<<"输入姓名:"; //通过判断使输入兼容了修改函数的功能? cin>>n ; if(name)delete []name; name=new char[ strlen(n)+1]; strcpy( name, n ); cout<<"输入身份证:"; cin>>ID ; cout<<"输入年龄:"; cin>>age; cout<<"输入专业:"; cin>>speciality ; cout<<"输入学号:"; cin>>number; } Student::~Student() { if(name) delete[]name; } int Student::getage() { return age; //获取年龄 } char*Student::getID () { return ID; //获取身份证 } char*Student::getname () { return name; //获取姓名 } char*Student::getnumber() { return number; //获取学号 } char*Student::getspec() { return speciality ; //获取专业 } ``` ``` #include<iostream> #include "identify student.h" using namespace std; const int N=10; //最大学生人数 void menu(); //显示菜单 void OutputStu( Student *array ); //输出学生信息 void IntputStu(Student *array); //输入学生信息 int SearchStu( Student *array, char *na); //查询学生信息 int Count=0; //全局变量:当前学生人数 int main() { Student array[N]; //声明学生对象数组 int choice; do { menu(); cout<<"Please Intput your choice:"; cin>>choice; getchar(); //增加该语句,读走回车符 if( choice>=0 && choice <= 3 ) switch(choice) { case 1:IntputStu(array);break; case 2:cout<<"Intput the name searched"<<endl; char na[20]; cin>>na; int i; i=SearchStu(array, na); if(i==N)cout<<"查无此人!\n"; else array[i].output(); break; case 3:OutputStu(array); break; default:break; } }while(choice); return 0; } void menu() //显示菜单函数 { cout<<"**********1.录入信息**********"<<endl; cout<<"**********2.查询信息**********"<<endl; cout<<"**********3.浏览信息**********"<<endl; cout<<"**********0.退 出**********"<<endl; } void OutputStu( Student *array) //输出对象数组元素 { cout<<"学生总人数="<<Count<<endl; for(int i=0 ; i<Count ; i++) array[i].output(); } int SearchStu( Student *array, char *na ) //按姓名查询 { int i,j=N; //设置j的初值为N for(i=0 ; i<Count ; i++) if( strcmp( array[i].getname() , na) == 0 ) j=i; //记录下标值 return j; //返回下标值 } void IntputStu(Student *array ) //输入对象数组元素 { char ch; do { array[Count].intput(); Count++; cout<<"继续输入吗?(Y or N )"<<endl; cin>>ch; }while(ch=='Y'); } ``` 1>e:\编程仓库\2号仓库(c++)\大实验2号\大实验2号\identify student.cpp(62): error C2084: 函数“Student::~Student(void)”已有主体 1> e:\编程仓库\2号仓库(c++)\大实验2号\大实验2号\identify student.h(19) : 参见“{dtor}”的前一个定义 1> 正在生成代码... 1> 1>生成失败。 1>
临时对象到底是不是对象,为什么我的代码会出错?c++
![图片说明](https://img-ask.csdn.net/upload/201812/17/1545051813_33149.png) 代码也贴过来了,希望好心大佬回答一下本人新鸟,没有积分,无法报答,好不意思 #include<iostream> using namespace std; class Box { public: Box(int a = 1)//构造函数 { this->a = a; //初始化数据成员a = 1 } Box operator +(Box &h) //运算符重载+ { return Box(a + h.a);//返回一个临时对象,其数据成员的值为 “+”前后两个对象数据成员的和 } friend void operator <<(ostream &, Box &);//类内声明友元函数,来重载<< private: int a; //私有数据成员 a }; void operator <<(ostream &n,Box &Object)//友元重载函数的类外定义 { n << Object.a; //输出Box对象的数据成员a } int main() { Box A,B; cout << A;// cout 对象A可以 ** cout << A + B;//此处报错,为什么 cout 临时无名对象却不可以??????(错误为:“没有与这些操作匹配的 << 运算符”**) return 0; }
请教ADO操作Access库重复用ADO对象的问题
我写了一个CADO类,我在构造函数里初始化com组件,创建连接对象并实例化。在析构函数里清除com组件,并关闭连接对象。我还写个一个函数_Recoreset ExcuteSQL(CString str) 里面定义了一个记录集对象并且实例化,然后将参数转化成SQL 语句,打开记录集并且把记录集返回。 ``` CADO::CADO() { //初始化COM库 ::CoInitialize(NULL); try { //创建连接对象实例 m_pConnection.CreateInstance("ADODB.Connection"); //设置连接字符串 CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\uid=;pwd=;DBQ=xueshengchengji.mdb;"; //使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown); } catch(_com_error e) { CString errormessage; errormessage.Format("%s",e.ErrorMessage()); AfxMessageBox(errormessage); } } CADO::~CADO() { //关闭记录集和连接 m_pConnection->Close( ); m_pConnection.Release( ); //清除COM库 ::CoUninitialize( ); } ``` ``` _RecordsetPtr CADO::ExecuteSQL(CString bstrSQL) { _RecordsetPtr pRecordset (__uuidof(Recordset)); try { pRecordset=m_pConnection->Execute(_bstr_t(bstrSQL), NULL, adCmdText); } catch(_com_error e) { CString errormessage; errormessage.Format("%s",e.ErrorMessage()); AfxMessageBox(errormessage); } return pRecordset; } ``` 在一个列表框中我想单击列表的某一列,就按此类进行排序(升序或降序)显示。于是我写了如图函数。点击一次实现了排序,但是再次点击时就显示 IDispatch error #3092。SQL语句经测试没有错误。我想是因为在函数里再次调用ExcuteSQL函数和AddToList 函数前没有关闭记录集或者ADO对象(m_ado是CADO类的对象)造成的吧。请问该怎么解决? ``` void CTeacherDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here try { int colum; colum = pNMListView->iSubItem; switch(colum) { case 0: if(isAsc) { bstrSQL+=" order by ClassArrange.CourseID DESC"; isAsc=FALSE; } else { bstrSQL+=" order by ClassArrange.CourseID ASC"; isAsc=TRUE; } //m_Recordset.Requery(); MessageBox(bstrSQL); m_List.DeleteAllItems(); AddToList(bstrSQL); break; } } catch(_com_error e) { CString errormessage; errormessage.Format("%s",e.ErrorMessage()); AfxMessageBox(errormessage); } } ``` ``` void CTeacherDlg::AddToList(CString bstrSQL) { try { //打开记录集 m_pRecordset=m_ado.ExecuteSQL(bstrSQL); while(!m_pRecordset->adoEOF) { m_List.InsertItem(0,""); m_List.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("CourseID")); m_List.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("CourseName")); m_List.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("ClassName")); m_List.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("StudentID")); m_List.SetItemText(0,4,(char*)(_bstr_t)m_pRecordset->GetCollect("StudentName")); m_List.SetItemText(0,5,(char*)(_bstr_t)m_pRecordset->GetCollect("MajorName")); m_List.SetItemText(0,6,(char*)(_bstr_t)m_pRecordset->GetCollect("Grade")); //将记录集指针移动到下一条记录 m_pRecordset->MoveNext(); } } catch(_com_error e) { CString errormessage; errormessage.Format("%s",e.ErrorMessage()); AfxMessageBox(errormessage); } } ``` //以下是SQL语句 ``` //设置查询字符串 bstrSQL.Format("SELECT Teacher.TeacherID, ClassArrange.CourseID, Course.CourseName, Class.ClassName, \ Grade.StudentID, Student.StudentName, Major.MajorName, Grade.Grade\ FROM Teacher INNER JOIN (((Major INNER JOIN Class ON Major.MajorID = Class.Major)INNER JOIN Student ON \ Class.ClassID = Student.ClassID) INNER JOIN ((Course INNER JOIN ClassArrange ON Course.CourseID = \ ClassArrange.CourseID) INNER JOIN Grade ON Course.CourseID = Grade.CourseID) ON Student.StudentID = Grade.StudentID)\ ON Teacher.TeacherID = ClassArrange.TeacherID WHERE (((Teacher.TeacherID)='%s')) ",m_Name1); ``` 错误信息为: IDispatch error#3092 Unkoown error 0x800A0E78 当第一次运行函数 void CTeacherDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) 时没有错误,再次进入就有问题了。
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
python 简易微信实现(注册登录+数据库存储+聊天+GUI+文件传输)
socket+tkinter详解+简易微信实现 历经多天的努力,查阅了许多大佬的博客后终于实现了一个简易的微信O(∩_∩)O~~ 简易数据库的实现 使用pands+CSV实现数据库框架搭建 import socket import threading from pandas import * import pymysql import csv # 创建DataFrame对象 # 存储用户数据的表(...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问