stack에 []연산자를 중첩시켜 배열처럼 사용하기..

munamuna의 이미지

안녕하세요.. __);
개발도중 도저히 풀리지 않는 것이 있어서 질문 올립니다.
부디 도움의 손길을 뻗어주세요...ㅠ.ㅠ

받아온 코드에서 STL stack(이하 스택이라고 하겠습니다)을 사용하고 있습니다.

이 코드를 이용해서 새로운 코드를 짜야 하는데, 바로바로 인덱싱을 하고 싶습니다.
stack c1;

c1.push(1);
c1.push(2);

if( c1[2] == 2) <- 이런식의 사용을 하고 싶습니다.

기존 코드를 손댈 수는 없는 상황이므로 스택의 특정 위치 번호를 가져오도록 함수를 만들려고 보니..
이왕 만들거라면 스택을 상속받아 파생 클래스를 만든 후에 해당 클래스에 []연산자 중첩을 시키자!! 라는 생각이 들더군요.

이렇게 하면 선언부에서만 stack을 MyStack으로 고치는 것으로 기존 코드를 그대로 사용할 수 있고, 제가 추가할 새로운 코드에서 바로바로 위치를 인덱싱 할 수 있기 때문입니다.

해서 다음과 같은 코드를 만들었습니다.

#include <iostream>
#include <stack>
#include <map>
#include <string>
using namespace std;
 
class MyStack : public stack<int>
{
	int targetValue;
public:
	int operator [](int pos) 
	{
		std::cout << "operator value : " << pos << endl;
		int x;
		stack<int> temp;
 
		for (int i = 0; i <= pos; i++) {
			x = this->top();
			this->pop();
 
			temp.push(x);
		}
		targetValue = x;
 
		for (int i = 0; i <= pos; i++) {
			x = temp.top();
			temp.pop();
 
			this->push(x);
		}
		return targetValue;
	}
};
 
int main (int argc, char * const argv[]) 
{
	MyStack c1;
 
	c1.push(10);
	c1.push(20);
	c1.push(30);
 
	std::cout << "c1[2] value = " << c1[2] << endl;
    return 0;
}

이렇게 하고나서 오오~ 잘되는군!! 이라고 생각을 했는데..

배열인지라 c1[2] = 22; 이런 경우도 생긴다는 겁니다.

그래서

int operator [](int pos) 를 int &operator [](int pos) 로 변경을 했습니다.
그러고 나니, l-value 일때와 r-value일때를 int operator [](int pos) 내에서 알 방법이 없더군요.

이걸 해결하고 싶습니다.

(1) int operator [](int pos) 함수내에서 l-value 로 불려진건지 아닌지 알 방법이 있나요?

(2) 다른 방법으로 c1[2] = 22; 이러한 방식을 구현할 수 있을련지요?

대충 길만 알려주셔도 착실하게 잘 만듭니다.. ^^;
부탁드립니다.. __);

obbaya의 이미지

내부에서 알 방법이 없으면 두 개를 같이 써보세요.

하나는 const로 해서.

munamuna의 이미지

제가 좀 초보인지라..;;
약간만 더 설명 부탁드리겠습니다... ^_^)/

klara의 이미지

상수 멤버 함수를 알아보세요.

obbaya의 이미지

int &operator [](int pos) //L-V

int operator [](int pos) const //R-V

두 개를 같이 쓰면 되겠죠.

검색이 아쉽군요.

그리고 아래 philnet님 댓글은 꼭 참고하세요.

munamuna의 이미지

저 두개를 같이 쓴다고 해서 어떻게 해결이 된다시는 건지 도통 이해를 못하겠네요.. ^^;;;;

너무 모르는듯 싶어서 죄송합니다.

philnet님 말씀은 잘 알고 있습니다.
위에 구구절절 설명을 드린 이유때문에 어쩔수 없이 상속받아 쓰는 것입니다.

두분모두 답변 감사드립니다.. 직접 어떻게든 해보겠습니다.. __);

mithrandir의 이미지

int operator[](int pos); 

대신
int &operator[](int pos);

를 사용해보세요.

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr328.htm

참고.
----
추가 편집, 본문 마지막을 안 읽고 답을 달았었군요.;; 죄송합니다

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

munamuna의 이미지

관심갖어주셔서 감사합니다~

bugiii의 이미지

값을 읽고 쓰는 것은 구분할 수 없습니다. 상수와 비상수를 구분하는 것과는 다릅니다.

이런 경우 프록시를 이용해서 해결하기도 합니다.

More Effective C++ 책을 참고하세요.

munamuna의 이미지

답글에 상수이야기만 나와서 으음.. ㅡㅅㅡ)?? 하고 있었습니다.

프록시라는 것이 있나보군요... ;; 어째 이날이때까지 한번도 못들어본건지..ㅠ.ㅠ;;;

지금 책이 없는지라.. 돌아가는 대로 확인해 보겠습니다.

감사합니다.. __);

philnet의 이미지

조금 다른 얘기지만, 일반적인 STL container class 들은 base class로 사용될 것에 대한 고려가 되어 있지 않은 것으로 알고 있습니다. 잘못 사용할 경우, 예상치 못한 문제로 인해 고생할 수 있습니다.

그리고 올려주신 코드를 보면, MyStack 클래스는 stack 클래스로부터 public 상속 받는 것 보다는, stack 클래스를 멤버로 포함해서 위임에 의해 구현하는 것이 더 바람직한 것으로 보입니다.

다시 말해, 단순히 stack<> 클래스의 public 멤버 함수들을 별도의 선언 없이, 그대로 재사용하려는 목적으로 public 상속을 쓰는 것은 바람직하지 않습니다. 그보다는 위임 혹은 private 상속을 사용하시는 것이 좋습니다. (이에 대한 자세한 내용은 Effective 시리즈에 잘 정리되어 있습니다.)

상속과, operator overloading, STL을 사용해야 하는 상황이면, 슬슬 C++의 재미를 느낄 수 있는 단계로 들어가시는 것이고요, 그 단계에서 Effective 시리즈는 반드시 숙독하실 필요가 있을 듯 싶습니다. 거기에 조금 더 욕심을 내어 디자인 패턴까지 가면 더 좋을 테고요.

행운(?)을 빕니다.

munamuna의 이미지

네.. 말씀해주신 내용 잘 알고 있습니다..

질문하고 관계 없는 내용인지라 자세하게는 적지 않았지만, 멤버로 포함해서 구현을 할수가 없는 상황입니다.

멤버로 포함하거나 다른 방식을 이용할 경우 같은 코드를 두벌로 나눠서 관리해야 되는 문제점이 생기기 때문에 상속을 이용하고자 하는 것입니다.

관심 갖어주셔서 감사합니다. 열심히 해보겠습니다.. ^^*

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.