C++ 대입연산자 오버로딩 관련 질문입니다.

canuyes의 이미지

C++ 대입연산자(=)를 전역함수 기반으로 오버로딩 하려고 합니다.
제가 생각하는 방법대로 하니 자꾸만 오류가 나네요...

#include<iostream>
#include<cstring>
using namespace std;
 
class String{
      private:
              char* str;
      public:
             String(char* temp){
                          str=new char[strlen(temp)+1];
                          strcpy(str,temp);
             }
             ~String(){
                       delete[] str;
             }
             void print(void){
                  cout<<str<<endl;
                  return;
             }
             friend void operator=(char* temp,String& s);
};
 
void String::operator=(char* temp,String& s){
     temp=new char[strlen(s.str)+1];
     strcpy(temp,s.str);
     return;
}
 
int main(void){
 
    system("PAUSE");
    return 0;
}

main함수에서

String s("Hello");
const char* sz=s;

같은 문장을 사용하고 싶습니다..

어느 부분이 잘못 된것일까요??

klara의 이미지

발상도 잘못되었고 구현도 잘못되었습니다.
그러한 대입은 매우 제한적으로 밖에 구현할 수 없으며, 대부분의 경우 원하는 동작이 아닐 것입니다.
혹시 다른 언어를 먼저 공부하셨나요?
C(C++이 아니라 C입니다)를 한번도 공부한적이 없으시다면 포인터를 다루기 전에 C입문서를 한번 정독하시기를 추천합니다.

익명 사용자의 이미지

원하시는 게 맞는 지 모르겠지만

STL의 string클래스의 멤버함수 c_str()이 비슷한 기능을 할 수 있을 거 같습니다.

가령

std::string hello("hello string");
const char *hello_c_str = hello.c_str();
printf("%s\n", hello_c_str);

이런 식의 동작이 가능합니다.

gilgil의 이미지

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B URL을 참조해 보세요.

class String
{
...
operator const char*() { ... }
};

익명 사용자의 이미지

C 기본 자료형을 두고 이런 표현을 쓰긴 넌센스지만

const char* sz=s;

라면... 이때는 sz의 대입연산자가 아니라 복사생성자가 호출되야 할 겁니다.
물론 sz가 객체가 아니니까 그럴일도 없지만 말이죠...
canuyes의 이미지

답변 진심으로 감사드립니다 gilgil님 답변으로 해결 했습니다.
사실 이 문제는 직접 구현하려 한 것 이라기 보다는
STL을 공부중에 잠시 쉬어가는 코너에 소개되어있던 문제였습니다...ㅠㅠ
굳이 구현을 해보라는 문제가 나와있기에 올려 봤습니다..

156489753의 이미지

저도 대입연산자 오버로딩한ㄴ데 왜안되지... 하고있다가 여기 들어와서 깨달았네요.
대입연산자는 전역으로는 안되는구나..ㅜㅜ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.